kubernetes中的kata

1.1 OCI 和 CRI-O

OCI 标准是为了避免容器标准被 Docker 独家挟持而出现的。

CRI 标准将 Kubelet 与运行时解耦,实现 CRI 标准的容器管理程序都可以用于 Pod 创建。

CRI-O 插件同时实现了 CRI 和 OCI 标准,可以用于替换 Containerd 直接与 runV 等 OCI runtime 对接。

如下图:

img

1.2 Kata 与 Containerd

为了兼容 OCI 标准,Docker 将管理运行时的功能从 Docker Daemon 中剥离出来,形成了 Containerd 。在运行容器时,可以不用 Docker 的 runc ,而替换为 kata-runtime 。

img

1.3 Kata 与 Kuberntes 的集成

如下图,Kata 主要替换的是 OCI runtime 层,其他部分与基于 Docker runc 的 Kubernetes 并无差异。同时,基于 kata-runtime 的 Pod 和基于 runc 的 Pod 可以共存于集群之中。

img

目前的主要问题是,Kata 不支持 host 网络。而 Kubernetes 中,etcd、nodelocaldns、kube-apiserver、kube-scheduler、metrics-server、node-exporter、kube-proxy、calico、kube-controller-manager 等,也就是 Static Pod 和 Daemonset 都会使用 host 网络。所以在安装部署时,依然使用 runc 作为默认的运行时,而将 kata-runtime 作为可选的运行时给特定的负载使用。

openstack-更换mysql地址

因为延时问题,openstack 集群因为需要更换mysql地址,

原本以为变更完yaml使用 kolla-ansible reconfigure 一下就可以了,但发现仍然有部分连接旧mysql数据库

排查发现连接的nova_cell0数据库

1
2
#grep mysql -R /etc/kolla
排查数据库地址都是正确的,为什么仍然有连接旧数据库的地址呢? 怀疑数据库表数据存在写死的问题~

由于是连接的nova_cell0 , 想到cell设计为了拆分数据库等,查一下数据库吧?

1
2
3
#mysql -h***************
发现nova_api的cell_mappings表中记录的mysql的endpoint,但cell0的仍然是旧的
>update cell_mappings set database_connection='mysql+pymysql://nova:********@10.220.*.*:21200/nova_cell0' where id=1;

问题解决~

linux-python生成主机唯一UUID

主机需要有一个唯一的uuid,对于物理机存在主板uuid获取不到的情况,所以根据相关信息,生成一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
#coding: utf-8
import re
import subprocess

'''
兼容python2/python3
'''
#默认shell执行函数
def shellutil(cmd):
p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
return p.communicate()
#获取厂商信息
def getManufacturer():
cmd="dmidecode -t 1|grep Manufacturer|awk -F': ' '{print $2}'"
resp=shellutil(cmd)
if resp[1] == "":
return resp[0].decode('UTF-8').lower().zfill(4)
else:
return "null"
#获取主板sn
def getSN():
cmd="dmidecode -t 1|grep 'Serial Number'|awk '{print $NF}'"
resp = shellutil(cmd)
if resp[1] == "":
return resp[0].decode('UTF-8').lower()[0:4].zfill(4)
else:
return "0000"
#获取设备UUID
def getUUID():
cmd="dmidecode -s system-uuid"
resp = shellutil(cmd)
uuid = resp[0].decode('UTF-8')
match = re.match(r'(.*?)-(.*?)-(.*?)-(.*?)-(.*?)', uuid, re.M | re.I)
if resp[1] == "" and match:
return resp[0].strip()
else:
return "ERROR"
#获取默认路由网卡mac
def getFirstIpMac():
resp=[]
eth_cmd="ip route|grep default|awk '{print $NF}'"
eth_resp = shellutil(eth_cmd)
if eth_resp[1] == "":
resp.insert(0,eth_resp[0].strip().decode('UTF-8').lower().zfill(4))
else:
resp.insert(0,"lo".lower().zfill(4))
mac_cmd='ifconfig eth2|egrep ":[0-9a-z]*:"|awk \'{print $2}\''
mac_resp=shellutil(mac_cmd)
if mac_resp[1] == "":
resp.insert(1,mac_resp[0].decode('UTF-8').replace(":","")[4:])
else:
resp.insert(1,"00000000")
return resp
def main():
uuid_err_pre = "00000000"
uuid=getUUID()
route_eth= getFirstIpMac()[0]
route_eth_mac=getFirstIpMac()[1]
if uuid != "ERROR":
print(uuid)
else:
fact=getManufacturer()[0:4]
print('{}-{}-{}-{}-{}'.format(uuid_err_pre,fact,getSN(),route_eth,route_eth_mac))
if __name__ == '__main__':
main()

mariadb-更改用户密码

通过yum安装的MariaDB直接就能登陆,默认密码为空!需要修改root密码

命令

1
2
3
4
use mysql;
update user set password=password('new password') where user = 'root';
flush privileges;
exit;1234

或者

1
2
set password for 'root'@'localhost'=password('new password');
exit;

openstack, kvm, qemu-kvm以及libvirt之间的关系

KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直接用它的。

QEMU-KVM就是一个完整的模拟器,它是构建基于KVM上面的,它提供了完整的网络和I/O支持。

Openstack不会直接控制qemu-kvm,它会用一个叫libvirt的库去间接控制qemu-kvm。libvirt提供了跨VM平台的功能,它可以控制除了QEMU之外的模拟器,包括vmware, virtualbox, xen等等。

所以为了openstack的跨VM性,所以openstack只会用libvirt而不直接用qemu-kvm。libvirt还提供了一些高级的功能,例如pool/vol管理。

核心组件kubelet 讲解

一 kubelet概述

1.1 kubelet作用

在Kubernetes集群中,在每个Node(又称Minion)上都会启动一个kubelet服务进程。该进程用于处理Master下发到本节点的任务,管理Pod及Pod中的容器。每个kubelet进程都会在API Server上注册节点自身的信息,定期向Master汇报节点资源的使用情况,并通过cAdvisor监控容器和节点资源。

Read More

证书过期之kubeadm重新生成s证书

k8s证书过期之kubeadm重新生成证书

重新生成证书
检查过期
新版本(1.15+):kubeadm alpha certs check-expiration

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ‘ Not ‘
其他同理
证书备份
cp -rp /etc/kubernetes /etc/kubernetes.bak
移除过期证书
rm -f /etc/kubernetes/pki/apiserver*
rm -f /etc/kubernetes/pki/front-proxy-client.*
rm -rf /etc/kubernetes/pki/etcd/healthcheck-client.*
rm -rf /etc/kubernetes/pki/etcd/server.*
rm -rf /etc/kubernetes/pki/etcd/peer.*
备注:可以使用命令openssl x509 -in [证书全路径] -noout -text查看证书详情。

重新生成证书
老版本:kubeadm alpha phase certs all

新版本(1.15+):kubeadm alpha certs renew all 使用该命令不用提前删除过期证书
重新生成配置文件

重新生成配置

mv /etc/kubernetes/*.conf /tmp/
老版本:kubeadm alpha phase kubeconfig all

新版本(1.15+):kubeadm init phase kubeconfig all

重新生成配置

cp /etc/kubernetes/admin.conf ~/.kube/config
重启kubelet
systemctl restart kubelet
证书过期时间确认
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ‘ Not ‘
其他同理
集群确认
kubectl get nodes

如果发现集群,能读不能写,则请重启一下组件:

docker ps | grep apiserver
docker ps | grep scheduler
docker ps | grep controller-manager

docker restart 容器标识
做一个有底蕴的软件工作者

centos7-rabbitmq 3.8 集群部署

基于CentOS 7 x86_64 rabbitmq 3.8

1. 安装依赖
1
安装docker-ce环境
1
2
3
4
5
6
#mkdir -p /data/rabbitmq/rabbit-docker-database 
#vim /data/rabbitmq/rabbit-docker-hosts

10.250.250.120 rabbit1 ostack120
10.250.250.121 rabbit2 ostack121
10.250.250.122 rabbit3 ostack122

3. 安装rabbitmq

1
2
3
4
主节点 120 执行
#docker run -d --restart=always --net host --hostname rabbit1 --name myrabbit1 -v /data/rabbitmq/rabbit-docker-hosts:/etc/hosts -v /data/rabbitmq/rabbit-docker-database:/var/lib/rabbitmq -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.5-management
从节点 121 执行
#docker run -d --restart=always --net host --hostname rabbit2 --name myrabbit2 -v /data/rabbitmq/rabbit-docker-hosts:/etc/hosts -v /data/rabbitmq/rabbit-docker-database:/var/lib/rabbitmq -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.5-management

4. 加入集群

1
2
3
4
5
6
#docker exec -it myrabbit2 bash # 进入镜像命令行
#rabbitmqctl stop_app
//rabbitmqctl reset
#rabbitmqctl join_cluster rabbit@rabbit1 #rabbit1为主节点的hostname
#rabbitmqctl start_app
#rabbitmq-plugins enable rabbitmq_management

5. 权限初始化

1
2
3
4
5
新增账号权限
#rabbitmqctl add_user openstack Openstack
#rabbitmqctl set_permissions openstack ".*" ".*" ".*";
#rabbitmqctl set_policy ha-all "" '{"ha-mode":"all", "ha-sync-mode": "automatic"}'

排错

rabbitmq1 可能会挂掉,可能需要重启 myrabbit1

附录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
启动rabbitmq
rabbitmqctl start_app

停止rabbitmq
rabbitmqctl stop_app

rabbitmq 查看所有队列信息
rabbitmqctl list_queues

还原 rabbitmq 清除所有队列
rabbitmqctl reset

rabbitmq 查看用户
rabbitmqctl list_users

rabbitmq添加用户
rabbitmqctl add_user root root

rabbitmq设置权限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

rabbitmq查看集群状态信息
rabbitmqctl cluster_status

移除某个集群节点:一般情况当节点故障时,在正常的节点中,移除该故障节点
rabbitmqctl -n rabbit@rabbit1 forget_cluster_node rabbit@rabbit3