当前位置: 首页>编程语言>正文

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析

这边用一个清洗项目来做一个简单的部署例子,这个项目的功能是,启动一个消费rabbitmq 的项目,mq中存储的是数据队列,容器消费mq ,获取数据,进行实体识别,对数据进行清洗处理,下面分别创建4个服务,扩容和缩减

创建

这里由于我的registry是放在阿里云上的,所以需要先添加 secret docker-registry,否则在 k8s 中 pull images 会出现 以下这种错误:

Failed to pull image "registry.cn-hangzhou.aliyuncs.com/leon0204/xxxx": rpc error: code = Unknow

解决办法如下:

kubectl create secret docker-registry cleansecret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=你的name \
--docker-password=你的密码

查看创建的密钥

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_IP,第1张

yml文件加入密钥参数

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_IP_02,第2张

这样就可以在 创建中 免密拉取镜像了 ~

kubectl create -f clean.yaml

容器创建中,第一次你还可能看到这样的橙色过渡,之后如果更新,或者删除重新创建,都是很快创建完成,因为第一次是从registry 拉取镜像,之后本地有镜像缓存,即使是更新也会很快创建

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_4s_03,第3张

容器创建完成

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_kubernetes_04,第4张

通过 rabbitmq 的 queue 页面 可以看到有4个消费者

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_IP_05,第5张

去 Node 节点上查看创建的容器Node1 节点

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_IP_06,第6张

Node2 节点

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_4s_07,第7张

可以看到这里 两个 Node 节点 分别启动了 2个 正在运行的 容器 和 2个 pause 容器

k8 调整 Deployment 的副本数

# 上面,我们创建了4个容器 此时有4个服务在进行清洗,如果我们想扩容到10个,怎么操作呢?

[root@ecs-ca42 sc]# kubectl get pods -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE
clean-pod-6c79ccd7d5-4lcsb   1/1     Running   1          4h    10.244.7.5    k8s-node1   <none>
clean-pod-6c79ccd7d5-pdt47   1/1     Running   0          4h    10.244.4.14   k8s-node2   <none>
clean-pod-6c79ccd7d5-sm5z2   1/1     Running   0          4h    10.244.7.4    k8s-node1   <none>
clean-pod-6c79ccd7d5-x7275   1/1     Running   0          4h    10.244.4.13   k8s-node2   <none>

# 非常的简单,kubectl scale deployment pod-name --replicas=n

[root@ecs-ca42 sc]# kubectl scale deployment clean-pod --replicas=10
deployment.extensions/clean-pod scaled


# 查看扩容后的 数量 
[root@ecs-ca42 sc]# kubectl get pods -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE
clean-pod-6c79ccd7d5-2x84m   1/1     Running   0          4s    10.244.7.7    k8s-node1   <none>
clean-pod-6c79ccd7d5-4lcsb   1/1     Running   1          4h    10.244.7.5    k8s-node1   <none>
clean-pod-6c79ccd7d5-97db5   1/1     Running   0          4s    10.244.4.16   k8s-node2   <none>
clean-pod-6c79ccd7d5-c4vsn   1/1     Running   0          4s    10.244.7.8    k8s-node1   <none>
clean-pod-6c79ccd7d5-hjpxf   1/1     Running   0          4s    10.244.4.15   k8s-node2   <none>
clean-pod-6c79ccd7d5-pdt47   1/1     Running   0          4h    10.244.4.14   k8s-node2   <none>
clean-pod-6c79ccd7d5-pdxvc   1/1     Running   0          4s    10.244.4.17   k8s-node2   <none>
clean-pod-6c79ccd7d5-qnshk   1/1     Running   0          4s    10.244.7.6    k8s-node1   <none>
clean-pod-6c79ccd7d5-sm5z2   1/1     Running   0          4h    10.244.7.4    k8s-node1   <none>
clean-pod-6c79ccd7d5-x7275   1/1     Running   0          4h    10.244.4.13   k8s-node2   <none>

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_IP_08,第8张

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_4s_09,第9张

可以看到 已经扩容到 10个服务,同样的 如果想要缩减

[root@ecs-ca42 sc]# kubectl scale deployment clean-pod --replicas=5
deployment.extensions/clean-pod scaled
[root@ecs-ca42 sc]# kubectl get pods -o wide
NAME                         READY   STATUS        RESTARTS   AGE   IP            NODE        NOMINATED NODE
clean-pod-6c79ccd7d5-2x84m   1/1     Terminating   0          9m    10.244.7.7    k8s-node1   <none>
clean-pod-6c79ccd7d5-4lcsb   1/1     Running       1          4h    10.244.7.5    k8s-node1   <none>
clean-pod-6c79ccd7d5-97db5   1/1     Terminating   0          9m    10.244.4.16   k8s-node2   <none>
clean-pod-6c79ccd7d5-c4vsn   1/1     Terminating   0          9m    10.244.7.8    k8s-node1   <none>
clean-pod-6c79ccd7d5-hjpxf   1/1     Running       0          9m    10.244.4.15   k8s-node2   <none>
clean-pod-6c79ccd7d5-pdt47   1/1     Running       0          4h    10.244.4.14   k8s-node2   <none>
clean-pod-6c79ccd7d5-pdxvc   1/1     Terminating   0          9m    10.244.4.17   k8s-node2   <none>
clean-pod-6c79ccd7d5-qnshk   1/1     Terminating   0          9m    10.244.7.6    k8s-node1   <none>
clean-pod-6c79ccd7d5-sm5z2   1/1     Running       0          4h    10.244.7.4    k8s-node1   <none>
clean-pod-6c79ccd7d5-x7275   1/1     Running       0          4h    10.244.4.13   k8s-node2   <none>

错误处理

1

Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox "168640f2c2cea768f3734d6dc7858816f2bdf310c71acf31b35dfd03c367e327" network for pod "clean-pod-6c79ccd7d5-cqgzh": NetworkPlugin cni failed to set up pod "clean-pod-6c79ccd7d5-cqgzh_default" network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.3.1/24

# 解决办法
#在node(非master)节点上
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
##重启kubelet
systemctl restart kubelet
##重启docker
systemctl restart docker
再次 kubeadm join

2 pause-amd64 pull error

从docker.io把pause-amd64镜像取下来

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

3 如何重新生成 kubeadm join 的 token

kubeadm token create

> 1xxxx1


openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
> xxxxx2 

kubeadm join 172.16.0.100:6443 --token 1xxxx1 --discovery-token-ca-cert-hash sha256:xxxxx2

4 Failed to get system stats for “/system.slice/kubelet.service”: failed to get cgroup stats for "/system.slice/kubelet.service

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_k8s 设置最小容器数量_10,第10张

gcr.io/google_containers/pause-amd64 的作用

当我们stop一个

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_k8s 设置最小容器数量_11,第11张

k8s 设置最小容器数量 k8s 扩容与缩容步骤分析,k8s 设置最小容器数量 k8s 扩容与缩容步骤分析_kubernetes_12,第12张

看看官网对这个容器的解释

it’s part of the infrastructure. This is started first in all Pods to setup the network for the Pod.

pause-amd64是Kubernetes基础设施的一部分,Kubernetes管理的所有pod里,pause-amd64容器是第一个启动的,用于实现Kubernetes集群里pod之间的网络通讯。

这句话怎么理解呢?
我们知道,两个container 共享网络的方式可以在运行容器的时候 指定 --net=container:目标容器名 这个参数就可以了,那么Pod 在启动管理一组容器的时候,没法保证容器组的先后顺序,如何实现呢?难道要依次把每个启动的容器加入到前一个?又或者是加入第一个启动的容器?

这就是 Infra 容器 的作用,作为一个网络通讯的中间件,一个Pod 组首先启动 Infra 容器 ,然后Pod组中的容器全部加入这个 Infra 容器 ,这样就实现了 Network Namespace 共享的作用。Infra 容器 镜像基于 k8s.gcr.io/pause:3.1,这个地址会被墙,所以在 kubernetes 集群搭建1.11.3+dashboard 中 需要 # 先替换镜像(装墙镜像的常规操作) ,这也是为什么当启动时,因为墙的原因,首先报错的是,k8s.gcr.io/pause:3.1 这个镜像 pullbackFalse

pause-amd64,-- Infra 容器,是 一对一容器的父进程, 在 pause容器源码 上可以看到 这个容器是用 C 去写的,pause容器大部分时间都在沉睡,等待有信号将其唤醒。当容器 kill 的时候,pause 捕捉到这个信号,作出控制

pause dockerFile

FROM scratch
ARG ARCH
ADD bin/pause-${ARCH} /pause
ENTRYPOINT ["/pause"]



https://www.xamrdz.com/lan/55e1937668.html

相关文章: