Ansible一键部署高可用Kubernetes集群


声明:这是我在大学毕业后进入第一家互联网公司学习的内容


准备

前置要求与约定

  • 集群会使用到的端口号。

  • 各服务器时间与时区需一致,集群内服务器间时间差值不能大于1秒。

  • 文档以 4 个 CentOS 7.4 系统服务器安装高可用 Kubernetes 集群进行讲解。

  • 按照本文档安装 Kubernetes 集群时,Ansible 脚本会将服务器上防火墙关闭,请使用安全组进行网络权限控制。

  • Master(s) 服务器为 Kubernetes 控制服务器;Worker(s) 服务器为 Kubernetes 运算服务器;Etcd 服务器为组建Etcd 集群的服务器,Etcd 官方建议 Etcd 集群服务器个数为奇数个(比如1、3、5)以防止脑裂。

  • 为安全考虑按本教程安装的 Kubernetes 集群只会在 Master(s) 服务器上配置 kubectl 命令所需 kubeconfig,故 Worker(s) 服务器默认是无法使用 kubectl 命令的。

授权策略协议类型端口范围授权类型授权对象描述
允许TCP 80⁄80地址段访问0.0.0.0/0http协议访问集群
允许TCP443⁄443地址段访问0.0.0.0/0https
允许TCP 30000⁄32767地址段访问0.0.0.0/0NodePort访问集群
允许全部-1/-1地址段访问10.244.0.0/18跨节点 Pod 之间互相访问

准备配置文件

链接:https://pan.baidu.com/s/1fMms1KR72mzZJ94sGm6NAg
提取码:1997
复制这段内容后打开百度网盘手机App,操作更方便哦

解压文件kubeadm-ha-master.tar.gz后有下面的文件

我已经打包好了

[root@VM-28-16 kubeadm-ha-master]# ll
total 132
-rw-r--r--  1 root root    89 Jun  4 17:00 00-kernel.yml
-rw-r--r--  1 root root   103 Jun  4 17:00 01-base.yml
-rw-r--r--  1 root root    73 Jun  4 17:00 02-docker.yml
-rw-r--r--  1 root root    88 Jun  4 17:00 03-kubernetes-component.yml
-rw-r--r--  1 root root   115 Jun  4 17:00 04-load-balancer.yml
-rw-r--r--  1 root root   160 Jun  4 17:00 05-etcd.yml
-rw-r--r--  1 root root   133 Jun  4 17:00 06-kubernetes-certificates.yml
-rw-r--r--  1 root root    89 Jun  4 17:00 07-kubernetes-master.yml
-rw-r--r--  1 root root    89 Jun  4 17:00 08-kubernetes-worker.yml
-rw-r--r--  1 root root   113 Jun  4 17:00 09-post.yml
-rw-r--r--  1 root root    86 Jun  4 17:00 21-network-plugin.yml
-rw-r--r--  1 root root    89 Jun  4 17:00 22-ingress-controller.yml
-rw-r--r--  1 root root    91 Jun  4 17:00 23-kubernetes-dashboard.yml
-rw-r--r--  1 root root    85 Jun  4 17:00 24-metrics-server.yml
-rw-r--r--  1 root root    83 Jun  4 17:00 25-cert-manager.yml
-rw-r--r--  1 root root  1084 Jun  4 17:00 90-init-cluster.yml
-rw-r--r--  1 root root   698 Jun  4 17:00 91-add-master.yml
-rw-r--r--  1 root root   557 Jun  4 17:00 92-add-worker.yml
-rw-r--r--  1 root root   523 Jun  4 17:00 93-add-etcd.yml
-rw-r--r--  1 root root   995 Jun  4 17:00 94-upgrade-cluster.yml
-rw-r--r--  1 root root   115 Jun  4 17:00 95-certificates-renew.yml
-rw-r--r--  1 root root   394 Jun  4 17:00 96-backup-cluster.yml
-rw-r--r--  1 root root   730 Jun  4 17:00 97-restore-cluster.yml
-rw-r--r--  1 root root   374 Jun  4 17:00 99-reset-cluster.yml
-rw-r--r--  1 root root 10506 Jun  4 17:00 ansible.cfg
drwxr-xr-x  2 root root   240 Jun  4 17:00 docs
drwxr-xr-x  2 root root   220 Jun  4 17:00 example
-rwxr-xr-x  1 root root   319 Jun  4 17:00 install-ansible.sh
-rw-r--r--  1 root root  3286 Jul 17 17:00 inventory.ini
-rw-r--r--  1 root root  2585 Jun  4 17:00 LICENSE
drwxr-xr-x  2 root root    95 Jun  4 17:00 offline
-rw-r--r--  1 root root  5700 Jun  4 17:00 README.md
drwxr-xr-x 14 root root   201 Jun  4 17:00 roles
-rw-r--r--  1 root root  3299 Jun  4 17:00 Vagrantfile

你只需要关注一个配置文件inventory.ini

inventory.ini

IP分配

节点IP
master-1172.31.28.16
master-2172.31.28.17
master-3172.31.28.18
node-1172.31.28.19
node-2172.31.28.21
node-3172.31.28.22
VIP172.31.28.10

网段划分

注意:你必须保证你划分的子网的网段个数要超过你总节点数

比如你一共要部署3master-3node类型,你的子网划分就不能是172.32.192.0/23 因为这样最多只能划分172.32.192.0-255/24和172.32.193.0-255/24网段,而每个节点的默认虚拟网关都是独占一段的

如果从172.32.192.0/24开始算起 你至少要给他划分到172.32.198.255,里面包含了(172.32.192.0/24 172.32.193.0/24 172.32.194.0/24 172.32.195.0/24 172.32.196.0/24 172.32.197.0/24 172.32.198.0/24)为了方便扩容,我们设为172.32.192.0/20 可以划分16个网段,也就是最多容纳16个节点(包括master和node)

集群pod ip段

kube_pod_subnet=“172.32.192.0/20”

集群service ip段

kube_service_subnet=“172.31.208.0/20”

配置填写

; 将所有节点的信息在这里填写
;    第一个字段                  为节点内网IP,部署完成后为 kubernetes 节点 nodeName
;    第二个字段 ansible_user     为节点远程登录用户名
;    第三个字段 ansible_ssh_pass 为节点远程登录用户密码
[all]
172.31.28.16 ansible_user=root ansible_ssh_pass=123456
172.31.28.17 ansible_user=root ansible_ssh_pass=123456
172.31.28.18 ansible_user=root ansible_ssh_pass=123456
172.31.28.19 ansible_user=root ansible_ssh_pass=123456
172.31.28.21 ansible_user=root ansible_ssh_pass=123456
172.31.28.22 ansible_user=root ansible_ssh_pass=123456

; 私有云:
;    VIP 负载模式:
;       也就是负载均衡器 + keepalived 模式,比如常用的 haproxy + keepalived。
;       本脚本中负载均衡器有 nginx、haproxy、envoy 可供选择,设置 lb_mode 即可进行任意切换。
;       设置 lb_kube_apiserver_ip 即表示启用 keepalived,请先与服务器提供部门协商保留一个IP作为 lb_kube_apiserver_ip,
;       一般 lb 节点组中有两个节点就够了,lb节点组中第一个节点为 keepalived 的 master 节点,剩下的都为 backed 节点。
;
;    节点本地负载模式:
;       只启动负载均衡器,不启用 keepalived(即不设置 lb_kube_apiserver_ip),
;       此时 kubelet 链接 apiserver 地址为 127.0.0.1:lb_kube_apiserver_port。
;       使用此模式时请将 lb 节点组置空。
;
; 公有云:
;    不推荐使用 slb 模式,建议直接使用节点本地负载模式。
;    若使用 slb 模式,请先使用节点本地负载模式进行部署,
;    部署成功后再切换至 slb 模式:
;       将 lb_mode 修改为 slb,将 lb_kube_apiserver_ip 设置为购买到的 slb 内网ip,
;       修改 lb_kube_apiserver_port 为 slb 监听端口。
;    再次运行初始化集群脚本即可切换至 slb 模式。
[lb]
172.31.28.16
172.31.28.17
172.31.28.18


; 注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
172.31.28.16
172.31.28.17
172.31.28.18

[kube-master]
172.31.28.16
172.31.28.17
172.31.28.18

[kube-worker]
172.31.28.19
172.31.28.21
172.31.28.22

; 预留组,后续添加master节点使用
[new-master]

; 预留组,后续添加worker节点使用
[new-worker]

; 预留组,后续添加etcd节点使用
[new-etcd]

;-------------------------------------- 以下为基础信息配置 ------------------------------------;
[all:vars]
; 是否跳过节点物理资源校验,Master节点要求2c2g以上,Worker节点要求2c4g以上
skip_verify_node=false
; kubernetes版本
kube_version="1.15.5"
; 负载均衡器
;   有 nginx、haproxy、envoy 和 slb 四个选项,默认使用 nginx;
lb_mode="nginx"
; 使用负载均衡后集群 apiserver ip,设置 lb_kube_apiserver_ip 变量,则启用负载均衡器 + keepalived
lb_kube_apiserver_ip="172.31.28.10"
; 使用负载均衡后集群 apiserver port
lb_kube_apiserver_port="8443"
; 集群pod ip段
kube_pod_subnet="172.32.192.0/20"
; 集群service ip段
kube_service_subnet="172.31.208.0/20"
; 集群网络插件,目前支持flannel,calico,kube-ovn
network_plugin="flannel"
; Kubelet 根目录
kubelet_root_dir="/var/lib/kubelet"
; docker容器存储目录
docker_storage_dir="/var/lib/docker"

部署

# 进入部署文件夹,部署ansible环境
[root@VM-28-16 kubeadm-ha-master]# ./install-ansible.sh

# 安装完ansible后部署k8s集群
[root@VM-28-16 kubeadm-ha-master]# ansible-playbook -i inventory.ini 90-init-cluster.yml

# 如果部署失败,想要重置集群,执行:
[root@VM-28-16 kubeadm-ha-master]# ansible-playbook -i inventory.ini 99-reset-cluster.yml

# 部署完成后测试一下集群
[root@VM-28-16 ~]# kubectl get nodes
NAME           STATUS   ROLES            AGE   VERSION
172.31.28.16   Ready    etcd,lb,master   20h   v1.15.5
172.31.28.17   Ready    etcd,lb,master   20h   v1.15.5
172.31.28.18   Ready    etcd,lb,master   20h   v1.15.5
172.31.28.19   Ready    worker           20h   v1.15.5
172.31.28.21   Ready    worker           20h   v1.15.5
172.31.28.22   Ready    worker           20h   v1.15.5

即说明部署完成

补充

一般来说部署完集群只是第一步,后续你需要补齐监控、Helm、服务网格等组件,在这章不细讲了。

部署helm请参考 Helm简介及阿里云安装部署

部署监控请参考 Kubernetes可视化界面及监控安装

部署服务网格暂时还没写~~~

扩容节点

还是改inventory.ini文件,执行ansible-playbook的命令

# 在all组里加入新节点ip 
[all]
172.31.28.23 ansible_user=root ansible_ssh_pass=123456

# 在new-worker组里加入新节点
[new-worker]
172.31.28.23


# 改好后保存文件,然后执行

[root@vm-26-11 ~]# ansible-playbook -i inventory.ini 92-add-worker.yml

问题记录

etcd报错起不来

fatal: [172.31.28.17]: failed! => {"attempts": 12, "changed": true, "cmd": "docker run --net host -e etcdctl_api=3 -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd --rm registry.aliyuncs.com/k8sxio/etcd:3.4.3-0 etcdctl endpoint health --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt\n", "delta": "0:00:05.690875", "end": "2020-07-17 16:43:55.778524", "msg": "non-zero return code", "rc": 1, "start": "2020-07-17 16:43:50.087649", "stderr": "{\"level\":\"warn\",\"ts\":\"2020-07-17t08:43:55.557z\",\"caller\":\"clientv3/retry_interceptor.go:61\",\"msg\":\"retrying of unary invoker failed\",\"target\":\"endpoint://client-2d241951-f3e1-4e5d-9cf3-47dbe4bf7797/[127.0.0.1]:2379\",\"attempt\":0,\"error\":\"rpc error: code = deadlineexceeded desc = context deadline exceeded\"}\nhttps://[127.0.0.1]:2379 is unhealthy: failed to commit proposal: context deadline exceeded\nerror: unhealthy cluster", "stderr_lines": ["{\"level\":\"warn\",\"ts\":\"2020-07-17t08:43:55.557z\",\"caller\":\"clientv3/retry_interceptor.go:61\",\"msg\":\"retrying of unary invoker failed\",\"target\":\"endpoint://client-2d241951-f3e1-4e5d-9cf3-47dbe4bf7797/[127.0.0.1]:2379\",\"attempt\":0,\"error\":\"rpc error: code = deadlineexceeded desc = context deadline exceeded\"}", "https://[127.0.0.1]:2379 is unhealthy: failed to commit proposal: context deadline exceeded", "error: unhealthy cluster"], "stdout": "", "stdout_lines": []}


核心就是
https://localhost:2379 is unhealthy: failed to commit proposal: context deadline exceeded #3546

etcd初始化失败

分析原因,服务器时间未同步(没细查),但是同步各服务器的时间之后确实好。

猜想:etcd存储各个服务器的信息,包括时间,这个不同步可能后期会出问题

扩容节点报错

扩容节点的脚本执行完后发现新节点并没有加入到集群里

然后进入新节点查看,没有运行的容器也没有镜像,查看进程发现kubelet起来了,查看网卡接口发现没有flannel.1的

判断这些镜像没有,是不是因为镜像没有拉取到的原因。

[root@vm-26-23 ~]# docker images -a
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
[root@vm-26-23 ~]# docker ps -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                  PORTS
[root@vm-26-23 ~]# ps -aux|grep kube
root      9612  2.9  0.2 1906264 91656 ?       Ssl  Aug04  26:06 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs --hostname-override=172.31.26.23 --network-plugin=cni --pod-infra-container-image=gcr.azk8s.cn/google_containers/pause:3.1 --root-dir=/var/libkubelet
root     20955  0.2  0.0 1321452 32100 ?       Ssl  Aug04   2:18 
root     28066  0.0  0.0 112708   976 pts/0    S+   10:58   0:00 grep --color=auto kube
[root@VM-26-23 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:99:fb:23 brd ff:ff:ff:ff:ff:ff
    inet 172.31.22.17/24 brd 172.31.22.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::f6b6:1049:1ed5:1321/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:f3:fb:d1:c2 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

查看系统日志,发现报错果然拉不了这些Node节点的镜像

[root@vm-26-23 ~]# tail -f /var/log/messages
Aug  4 20:28:22 VM-26-23 dockerd: time="2020-08-04T20:28:22.778469318+08:00" level=error msg="Handler for POST /images/create returned error: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: \"<html>\\r\\n<head><title>403 Forbidden</title></head>\\r\\n<body bgcolor=\\\"white\\\">\\r\\n<center><h1>403 Forbidden</h1></center>\\r\\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\\r\\n</body>\\r\\n</html>\\r\\n\""
Aug  4 20:28:22 VM-26-23 kubelet: E0804 20:28:22.780471    9612 remote_runtime.go:105] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:22 VM-26-23 kubelet: E0804 20:28:22.780581    9612 kuberuntime_sandbox.go:68] CreatePodSandbox for pod "kube-proxy-75rvp_kube-system(646f319e-af39-4d97-a6ac-f5046dedda24)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:22 VM-26-23 kubelet: E0804 20:28:22.780654    9612 kuberuntime_manager.go:692] createPodSandbox for pod "kube-proxy-75rvp_kube-system(646f319e-af39-4d97-a6ac-f5046dedda24)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:22 VM-26-23 kubelet: E0804 20:28:22.780777    9612 pod_workers.go:190] Error syncing pod 646f319e-af39-4d97-a6ac-f5046dedda24 ("kube-proxy-75rvp_kube-system(646f319e-af39-4d97-a6ac-f5046dedda24)"), skipping: failed to "CreatePodSandbox" for "kube-proxy-75rvp_kube-system(646f319e-af39-4d97-a6ac-f5046dedda24)" with CreatePodSandboxError: "CreatePodSandbox for pod \"kube-proxy-75rvp_kube-system(646f319e-af39-4d97-a6ac-f5046dedda24)\" failed: rpc error: code = Unknown desc = failed pulling image \"gcr.azk8s.cn/google_containers/pause:3.1\": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: \"<html>\\r\\n<head><title>403 Forbidden</title></head>\\r\\n<body bgcolor=\\\"white\\\">\\r\\n<center><h1>403 Forbidden</h1></center>\\r\\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\\r\\n</body>\\r\\n</html>\\r\\n\""
Aug  4 20:28:25 VM-26-23 kubelet: E0804 20:28:25.338166    9612 kubelet.go:2173] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Aug  4 20:28:25 VM-26-23 kubelet: W0804 20:28:25.931418    9612 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d
Aug  4 20:28:30 VM-26-23 kubelet: E0804 20:28:30.364407    9612 kubelet.go:2173] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Aug  4 20:28:30 VM-26-23 kubelet: W0804 20:28:30.932040    9612 cni.go:213] Unable to update cni config: No networks found in /etc/cni/net.d
Aug  4 20:28:32 VM-26-23 kubelet: E0804 20:28:32.649344    9612 aws_credentials.go:77] while getting AWS credentials NoCredentialProviders: no valid providers in chain. Deprecated.
Aug  4 20:28:32 VM-26-23 kubelet: For verbose messaging see aws.Config.CredentialsChainVerboseErrors
Aug  4 20:28:32 VM-26-23 dockerd: time="2020-08-04T20:28:32.827430989+08:00" level=info msg="Attempting next endpoint for pull after error: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: \"<html>\\r\\n<head><title>403 Forbidden</title></head>\\r\\n<body bgcolor=\\\"white\\\">\\r\\n<center><h1>403 Forbidden</h1></center>\\r\\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\\r\\n</body>\\r\\n</html>\\r\\n\""
Aug  4 20:28:32 VM-26-23 kubelet: E0804 20:28:32.828824    9612 remote_runtime.go:105] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:32 VM-26-23 dockerd: time="2020-08-04T20:28:32.827650596+08:00" level=error msg="Handler for POST /images/create returned error: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: \"<html>\\r\\n<head><title>403 Forbidden</title></head>\\r\\n<body bgcolor=\\\"white\\\">\\r\\n<center><h1>403 Forbidden</h1></center>\\r\\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\\r\\n</body>\\r\\n</html>\\r\\n\""
Aug  4 20:28:32 VM-26-23 kubelet: E0804 20:28:32.828990    9612 kuberuntime_sandbox.go:68] CreatePodSandbox for pod "kube-flannel-ds-amd64-rtcnv_kube-system(e5ddc865-e0c2-4c9e-ad52-c854168ab26b)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:32 VM-26-23 kubelet: E0804 20:28:32.829060    9612 kuberuntime_manager.go:692] createPodSandbox for pod "kube-flannel-ds-amd64-rtcnv_kube-system(e5ddc865-e0c2-4c9e-ad52-c854168ab26b)" failed: rpc error: code = Unknown desc = failed pulling image "gcr.azk8s.cn/google_containers/pause:3.1": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\r\n</body>\r\n</html>\r\n"
Aug  4 20:28:32 VM-26-23 kubelet: E0804 20:28:32.829218    9612 pod_workers.go:190] Error syncing pod e5ddc865-e0c2-4c9e-ad52-c854168ab26b ("kube-flannel-ds-amd64-rtcnv_kube-system(e5ddc865-e0c2-4c9e-ad52-c854168ab26b)"), skipping: failed to "CreatePodSandbox" for "kube-flannel-ds-amd64-rtcnv_kube-system(e5ddc865-e0c2-4c9e-ad52-c854168ab26b)" with CreatePodSandboxError: "CreatePodSandbox for pod \"kube-flannel-ds-amd64-rtcnv_kube-system(e5ddc865-e0c2-4c9e-ad52-c854168ab26b)\" failed: rpc error: code = Unknown desc = failed pulling image \"gcr.azk8s.cn/google_containers/pause:3.1\": Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: \"<html>\\r\\n<head><title>403 Forbidden</title></head>\\r\\n<body bgcolor=\\\"white\\\">\\r\\n<center><h1>403 Forbidden</h1></center>\\r\\n<hr><center>nginx/1.14.0 (Ubuntu)</center>\\r\\n</body>\\r\\n</html>\\r\\n\""

解决方法

  • 直接从其他node节点已有的镜像导入到这台新的node节点上

主要是这4个镜像,版本号根据实际的情况而变

gcr.azk8s.cn/google_containers/kube-proxy                              v1.15.5             cbd7f21fec99        9 months ago        82.4MB
quay.azk8s.cn/kubernetes-ingress-controller/nginx-ingress-controller   0.26.1              29024c9c6e70        10 months ago       483MB
quay.azk8s.cn/coreos/flannel                                           v0.11.0-amd64       ff281650a721        18 months ago       52.6MB
gcr.azk8s.cn/google_containers/pause                                   3.1                 da86e6ba6ca1        2 years ago         742kB

进入一台node节点,导出镜像,并scp到其他机器

[root@vm-26-19 ~]# docker save -o flannel.tar.gz quay.azk8s.cn/coreos/flannel:v0.11.0-amd64
[root@vm-26-19 ~]# docker save -o  pause.tar.gz gcr.azk8s.cn/google_containers/pause:3.1
[root@vm-26-19 ~]# docker save -o  kube-proxy.tar gcr.azk8s.cn/google_containers/kube-proxy:v1.15.5
[root@vm-26-19 ~]# docker save -o  nginx-ingress-controller.tar  quay.azk8s.cn/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
[root@VM-26-19 ~]# ll
total 613372
-rw-------. 1 root root      1549 Nov 25  2019 anaconda-ks.cfg
-rw-------  1 root root  55390720 Aug  4 20:33 flannel.tar.gz
-rw-------  1 root root  84286464 Aug  4 20:39 kube-proxy.tar
-rw-------  1 root root 487647744 Aug  4 20:41 nginx-ingress-controller.tar
-rw-------  1 root root    754176 Aug  4 20:37 pause.tar.gz

[root@vm-26-19 ~]# scp * 172.31.26.23:/root/

再进入新节点,导入镜像

[root@vm-26-23 ~]# docker load <  flannel.tar.gz
[root@vm-26-23 ~]# docker load <  kube-proxy.tar
[root@vm-26-23 ~]# docker load <  nginx-ingress-controller.tar
[root@vm-26-23 ~]# docker load <  pause.tar.gz 

由于系统在不断尝试去拉取镜像,所以导入成功后系统会直接run这些镜像,即可完成后续加入集群的命令。

  • 自己从网上下载(科学上网)拉镜像,然后上传到这台新的node节点上(这里不作说明)

参考资料

Kubernetes集群部署


版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Ansible来实现一键部署高可用集群项目。下面是一个简单的步骤: 1. 创建一个Ansible的Inventory文件,定义你的服务器列表。例如: ``` [web] server1 ansible_host=<IP地址> ansible_user=<用户名> ansible_ssh_private_key_file=<私钥路径> [database] server2 ansible_host=<IP地址> ansible_user=<用户名> ansible_ssh_private_key_file=<私钥路径> ``` 2. 创建一个Ansible的Playbook文件,用于定义你的部署任务。例如: ```yaml --- - hosts: web become: true tasks: - name: 安装依赖软件包 yum: name: "{{ item }}" state: present with_items: - package1 - package2 - name: 配置Web服务器 template: src: web.conf.j2 dest: /etc/web.conf notify: - restart web handlers: - name: 重启Web服务器 service: name: web state: restarted - hosts: database become: true tasks: - name: 安装依赖软件包 yum: name: "{{ item }}" state: present with_items: - package3 - package4 - name: 配置数据库 template: src: db.conf.j2 dest: /etc/db.conf notify: - restart db handlers: - name: 重启数据库服务 service: name: db state: restarted ``` 在上面的例子中,我们通过使用`yum`模块安装了一些软件包,并使用`template`模块配置了一些配置文件。当配置文件发生变化时,会触发相应服务的重启。 3. 创建模板文件,用于生成配置文件。例如,`web.conf.j2`可以是一个Jinja2模板文件,如下所示: ``` server_name: {{ ansible_hostname }} listen_port: 80 ``` 在模板文件中,你可以使用Jinja2的语法来插入变量。 4. 运行Ansible Playbook来执行部署任务。使用以下命令: ``` ansible-playbook -i inventory.ini playbook.yaml ``` 其中,`inventory.ini`是你的Inventory文件,`playbook.yaml`是你的Playbook文件。 通过以上步骤,你就可以使用Ansible一键部署高可用集群项目了。当然,具体的配置和任务根据你的项目需求可能会有所不同。这只是一个简单的例子,你可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值