声明:这是我在大学毕业后进入第一家互联网公司学习的内容
准备
前置要求与约定
-
集群会使用到的端口号。
-
各服务器时间与时区需一致,集群内服务器间时间差值不能大于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/0 | http | 协议访问集群 |
允许 | TCP | 443⁄443 | 地址段访问 | 0.0.0.0/0 | https |
允许 | TCP 30000⁄32767 | 地址段访问 | 0.0.0.0/0 | NodePort | 访问集群 |
允许 | 全部 | -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-1 | 172.31.28.16 |
master-2 | 172.31.28.17 |
master-3 | 172.31.28.18 |
node-1 | 172.31.28.19 |
node-2 | 172.31.28.21 |
node-3 | 172.31.28.22 |
VIP | 172.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节点上(这里不作说明)
参考资料
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。