解决阿里云与公网的其他机器部署Kubernetes问题

本文最后更新于:a few seconds ago

前言

由于阿里云的公网 ip 绑定的网卡在外层网关,所以机器地监听不到

基本环境得安装

Debian / Ubuntu

1
2
3
4
5
6
7
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

另外,你也可以指定版本安装
apt-get install kubectl=1.19.3-00 kubelet=1.19.3-00 kubeadm=1.19.3-00

CentOS / RHEL / Fedora

1
2
3
4
5
6
7
8
9
10
11
12
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

Main

_ 下面代码除特殊说明的 x.x.x.x 都是您的 master 节点公网地址 _

构建 etcd

k8s 1.8 版本后,允许分段构建,所以我们要先构建一下 etcd phase。执行下面代码

1
kubeadm init phase etcd local

您需要打开两个终端,一个执行 kubeadm init ... 也就是下面创建集群的代码,此时会卡住。
另一个需要修改etcd.yaml里面的listen-client-urlslisten-peer-urls,具体看下面代码,

第一个终端创建集群

1
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=x.x.x.x --service-cidr=10.1.0.0/16  --pod-network-cidr=10.244.0.0/16

执行完第一个窗口会卡住,接着切换 master 的到第二个终端,执行下面代码。

第二个终端修改 etcd 监听地址

1
2
#第二个终端执行
vim /etc/kubernetes/manifests/etcd.yaml

第二个终端原来的内容:

1
2
3
4
5
6
7
8
9
10
11
#······ more
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://x.x.x.x:2380
- --initial-cluster=master=https://x.x.x.x:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379,https://x.x.x.x:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://x.x.x.x:2380
- --name=master
#······ more

第二个终端修改后的内容:

1
2
3
4
5
6
7
8
9
10
11
#······ more
- --client-cert-auth=true
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=https://x.x.x.x:2380
- --initial-cluster=master=https://x.x.x.x:2380
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --listen-client-urls=https://127.0.0.1:2379
- --listen-metrics-urls=http://127.0.0.1:2381
- --listen-peer-urls=https://127.0.0.1:2380
- --name=master
#······ more

稍等一会,第一个窗口 kubeadm init ...就执行成功了。

执行成功,终端会提醒我们执行下面命令

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

将 worker 加入集群

接着在 worker 节点 执行 kubeadm join 的代码, token 有效期默认 2 小时。

查看加入的节点

1
kubectl get ndoes

会查看到 master 节点和 node 节点都是 NotReady 状态。

接着就需要安装网络环境

在 master 节点和 node 节点都安装 flannel 插件

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

如果遇到错误就看日志

执行下面命令看看是否都处于 runing 状态

1
kubectl get pods --all-namespaces

看 kubelet

1
journalctl -f -u kubelet

pod 一直 CrashLoopBackOff

看看 log 对症下药

1
kubectl logs pod-name

看看是不是有缺少什么东西,如果缺少了就从 master 节点复制,如:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

1
2
# 这命令在 master 节点执行,x.x.x.x为你报错的节点的公网ip
scp /etc/docker/daemon.json root@x.x.x.x:/etc/docker/daemon.json

或者前往 对于的github issuse

failed: open /run/systemd/resolve/resolv.conf: no such file or directory

1
2
3
## 复制master的文件
scp /run/systemd/resolve/resolv.conf root@x.x.x.x:/run/systemd/resolve/resolv.conf
systemctl daemon-reload

/sys/fs/cgroup/pids/system.slice/etcd.service: no such file or directory

1
2
 vim /etc/docker/daemon.json
vim /run/flannel/subnet.env

network plugin is not ready: cni config uninitialized

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim /etc/cni/net.d/10-flannel.conflist
##输入下面内容
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}

network: /run/flannel/subnet.env is missing FLANNEL_NETWORK

1
2
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get pods --all-namespaces

排错技巧,kubeadm 进行故障排查Kubernetes 常用命令.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!