基础设施
centos 7.6 64位
内核版本:5.1.3-1.el7.elrepo.x86_64(手动升级,可免)
kubeadm
kubelet
node*3
初始准备
repo镜像
1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
升级内核
1
2
3
4
5
6
7
8
9
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
# 改引导
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
uname -sr
系统设置
1
2
3
4
5
6
7
8
9
10
11
# 禁用交换区
swapoff -a
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# 开启forward
# Docker从1.13版本开始调整了默认的防火墙规则
# 禁用了iptables filter表中FOWARD链
# 这样会引起Kubernetes集群中跨Node的Pod无法通信
iptables -P FORWARD ACCEPT
启用IPVS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# https://github.com/easzlab/kubeasz/issues/374
# 4.18内核将nf_conntrack_ipv4更名为nf_conntrack
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
装18.06.2的docker
按照kubernetes源代码安装特定docker版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=http://mirror.azure.cn/docker-ce/linux/centos/gpg
EOF
yum install -y docker-ce-18.06.2.ce-3.el7.x86_64
# 配置docker加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl start docker
systemctl enable docker.service
安装其他依赖
1
2
yum -y install yum nfs-utils wget nano yum-utils device-mapper-persistent-data lvm2 git docker-compose ipvsadm net-tools telnet
yum update -y
install-kubeadm
配置k8s的镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[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
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
# && systemctl start kubelet
安装集群
接下来要根据实际情况选择单master还是奇数台master了
kubeadm的默认配置文件”藏”在kubeadm config print init-defaults和kubeadm config print join-defaults中,这里要根据中国特色社会主义的实际情况进行修改。
1
2
kubeadm config print join-defaults --component-configs KubeProxyConfiguration //JoinConfiguration KubeProxyConfiguration
kubeadm config print join-defaults --component-configs KubeletConfiguration // JoinConfiguration KubeletConfiguration
一般来说serviceSubnet范围要比podSubnet小
podSubnet: 10.66.0.0/16注定了最多只能有65534个pod,serviceSubnet同理。
高可用型(生产用)
高可用性的特点在于N个etcd,kube-apiserver,kube-scheduler,kube-controller-manager,以组件的冗余作为高可用的基础。
api-server以负载均衡作为对外的入口。
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
# https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1#ClusterConfiguration
export HOST0=172.18.221.35
export HOST1=172.18.243.72
export HOST2=172.18.243.77
mkdir -p ${HOST0}/ ${HOST1}/ ${HOST2}/
ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=("infra0" "infra1" "infra2")
for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > ${HOST}/kubeadm-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: "kubeadm.k8s.io/v1beta1"
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
imageRepository: gcr.azk8s.cn/google_containers
# 这里配置了一个阿里云内网负载均衡作为入口,如果没有的话请自行忽略
# controlPlaneEndpoint: "172.18.221.7:6443"
networking:
# 规划pod CIDR
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --ignore-preflight-errors=all
# todo:
kubeadm join 172.18.221.35:6443 --token l0ei3n.rqqqseno29oo564z \
--discovery-token-ca-cert-hash sha256:9752be9ff3b619f5b6baadc98ed184e3e1dc2ff02b080aea2457b8f89496de2f
单master型(实验用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo tee kubeadm-config.yaml <<-'EOF'
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
# 这里配置了一个阿里云内网负载均衡作为入口,如果没有的话请自行忽略
# controlPlaneEndpoint: "172.18.221.7:6443"
imageRepository: gcr.azk8s.cn/google_containers
networking:
# 规划pod CIDR
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
EOF
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
配置kubelet客户端
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
配置网络插件
这里我选择quay.io/coreos/flannel:v0.11.0-amd64,因为架构比较齐全
引入其他master节点(高可用版)
在kubeadm init的输出中,有一行是
1
[upload-certs] Using certificate key: 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
复制起来,在别的master上面运行命令
1
2
3
4
5
kubeadm join 172.18.221.35:6443 \
--token 29ciq3.5mtkr4nzc11mlzd6 \
--discovery-token-ca-cert-hash sha256:03b46745a1f3887417270e33fc9b3fb5ddd82599f0d0ec789ed4edf2c310faae \
--experimental-control-plane \
--certificate-key 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
工作节点加入集群
1
2
kubeadm join 172.18.221.35:6443 --token c63abt.45sn8bhyxxo2lh0r \
--discovery-token-ca-cert-hash sha256:891e41e798c29f7235078479ca3e0622594c91db08160bea620f60fffcd558f5
收尾工作
1
ipvsadm -l
其他参考
[kubelet-check] Initial timeout of 40s passed.
1
2
systemctl status kubelet
journalctl -xeu kubelet
通过以上任意一个命令看到,kubernetes服务虽然启动中,但是提示节点找不到。
1
May 20 14:55:22 xxx kubelet[3457]: E0520 14:55:22.095536 3457 kubelet.go:2244] node "xxx" not found
最后发现是一开始指定了负载均衡,负载均衡连接不上导致超时
–ignore-preflight-errors=all
修改driver之后的注意事项
如果docker是之前安装的,改一下配置然后重启服务即可
改成systemd要在kubelet的服务上要加多一个参数,不然服务无法启动
1
2
3
4
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
1
2
3
4
# Restart docker.
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
master参与调度
1
2
# 去掉master污点,让其参与调度
kubectl taint $node --all node-role.kubernetes.io/master-
重置
1
2
kubeadm reset
ipvsadm --clear
重新计算discovery-token-ca-cert-hash
1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
todo
https://github.com/kubernetes/kubeadm/issues/1331
参考链接
Infrastructure
centos 7.6 64-bit
Kernel version: 5.1.3-1.el7.elrepo.x86_64 (manually upgraded, optional)
kubeadm
kubelet
node*3
Initial Preparation
repo Mirror
1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
Upgrade Kernel
1
2
3
4
5
6
7
8
9
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
# Change boot
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
uname -sr
System Settings
1
2
3
4
5
6
7
8
9
10
11
# Disable swap
swapoff -a
# Stop firewall
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# Enable forward
# Docker adjusted default firewall rules starting from version 1.13
# Disabled FOWARD chain in iptables filter table
# This will cause Pods across Nodes in Kubernetes cluster to be unable to communicate
iptables -P FORWARD ACCEPT
Enable IPVS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# https://github.com/easzlab/kubeasz/issues/374
# Kernel 4.18 renamed nf_conntrack_ipv4 to nf_conntrack
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
Install Docker 18.06.2
Install specific docker version according to kubernetes source code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=http://mirror.azure.cn/docker-ce/linux/centos/gpg
EOF
yum install -y docker-ce-18.06.2.ce-3.el7.x86_64
# Configure docker acceleration
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl start docker
systemctl enable docker.service
Install Other Dependencies
1
2
yum -y install yum nfs-utils wget nano yum-utils device-mapper-persistent-data lvm2 git docker-compose ipvsadm net-tools telnet
yum update -y
install-kubeadm
Configure k8s mirror
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[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
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
# && systemctl start kubelet
Install Cluster
Next, choose single master or odd number of masters based on actual situation.
kubeadm’s default configuration file is “hidden” in kubeadm config print init-defaults and kubeadm config print join-defaults. Here, modify according to the actual situation with Chinese characteristics.
1
2
kubeadm config print join-defaults --component-configs KubeProxyConfiguration //JoinConfiguration KubeProxyConfiguration
kubeadm config print join-defaults --component-configs KubeletConfiguration // JoinConfiguration KubeletConfiguration
Generally, serviceSubnet range should be smaller than podSubnet.
podSubnet: 10.66.0.0/16 means at most 65534 pods, same for serviceSubnet.
High Availability Type (Production Use)
High availability features N etcd, kube-apiserver, kube-scheduler, kube-controller-manager, using component redundancy as the basis for high availability.
api-server uses load balancing as the external entry point.
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
# https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1#ClusterConfiguration
export HOST0=172.18.221.35
export HOST1=172.18.243.72
export HOST2=172.18.243.77
mkdir -p ${HOST0}/ ${HOST1}/ ${HOST2}/
ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=("infra0" "infra1" "infra2")
for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > ${HOST}/kubeadm-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: "kubeadm.k8s.io/v1beta1"
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
imageRepository: gcr.azk8s.cn/google_containers
# Here configured an Alibaba Cloud intranet load balancer as entry point, if you don't have one please ignore
# controlPlaneEndpoint: "172.18.221.7:6443"
networking:
# Plan pod CIDR
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --ignore-preflight-errors=all
# todo:
kubeadm join 172.18.221.35:6443 --token l0ei3n.rqqqseno29oo564z \
--discovery-token-ca-cert-hash sha256:9752be9ff3b619f5b6baadc98ed184e3e1dc2ff02b080aea2457b8f89496de2f
Single Master Type (Experimental Use)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo tee kubeadm-config.yaml <<-'EOF'
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
# Here configured an Alibaba Cloud intranet load balancer as entry point, if you don't have one please ignore
# controlPlaneEndpoint: "172.18.221.7:6443"
imageRepository: gcr.azk8s.cn/google_containers
networking:
# Plan pod CIDR
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
EOF
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
Configure kubelet Client
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
Configure Network Plugin
Here I chose quay.io/coreos/flannel:v0.11.0-amd64, because the architecture is relatively complete
Add Other Master Nodes (High Availability Version)
In the output of kubeadm init, there’s a line:
1
[upload-certs] Using certificate key: 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
Copy it, run the command on other masters:
1
2
3
4
5
kubeadm join 172.18.221.35:6443 \
--token 29ciq3.5mtkr4nzc11mlzd6 \
--discovery-token-ca-cert-hash sha256:03b46745a1f3887417270e33fc9b3fb5ddd82599f0d0ec789ed4edf2c310faae \
--experimental-control-plane \
--certificate-key 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
Worker Nodes Join Cluster
1
2
kubeadm join 172.18.221.35:6443 --token c63abt.45sn8bhyxxo2lh0r \
--discovery-token-ca-cert-hash sha256:891e41e798c29f7235078479ca3e0622594c91db08160bea620f60fffcd558f5
Final Work
1
ipvsadm -l
Other References
[kubelet-check] Initial timeout of 40s passed.
1
2
systemctl status kubelet
journalctl -xeu kubelet
Through either of the above commands, you can see that although the kubernetes service is starting, it prompts that the node cannot be found.
1
May 20 14:55:22 xxx kubelet[3457]: E0520 14:55:22.095536 3457 kubelet.go:2244] node "xxx" not found
Finally found that a load balancer was specified at the beginning, and the load balancer connection timeout caused the timeout.
–ignore-preflight-errors=all
Notes After Modifying Driver
If docker was installed before, just change the configuration and restart the service.
To change to systemd, you need to add one more parameter to the kubelet service, otherwise the service cannot start.
1
2
3
4
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
1
2
3
4
# Restart docker.
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
Master Participates in Scheduling
1
2
# Remove master taint to let it participate in scheduling
kubectl taint $node --all node-role.kubernetes.io/master-
Reset
1
2
kubeadm reset
ipvsadm --clear
Recalculate discovery-token-ca-cert-hash
1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
todo
https://github.com/kubernetes/kubeadm/issues/1331
Reference Links
- Overview of kubeadm
- Alibaba Cloud Mirror Repository
- Official Installation Guide
- Using kubeadm to Install kubernetes
- centos7 Install kubeadm
- centos7 Use kubeadm to Install k8s-1.11 Version Multi-Master High Availability
- centos7 Use kubeadm to Install k8s Cluster
- kubernetes Cluster Installation Exception Summary
- kubeadm Setup Tool Reference Guide
- ipvs
インフラストラクチャ
centos 7.6 64ビット
カーネルバージョン:5.1.3-1.el7.elrepo.x86_64(手動アップグレード、オプション)
kubeadm
kubelet
node*3
初期準備
repoミラー
1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
カーネルのアップグレード
1
2
3
4
5
6
7
8
9
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
# ブートを変更
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
uname -sr
システム設定
1
2
3
4
5
6
7
8
9
10
11
# スワップを無効にする
swapoff -a
# ファイアウォールを停止
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# forwardを有効にする
# Dockerはバージョン1.13からデフォルトのファイアウォールルールを調整しました
# iptables filterテーブルのFOWARDチェーンを無効にしました
# これにより、Kubernetesクラスター内のNode間のPodが通信できなくなります
iptables -P FORWARD ACCEPT
IPVSを有効にする
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# https://github.com/easzlab/kubeasz/issues/374
# カーネル4.18はnf_conntrack_ipv4をnf_conntrackに名前変更しました
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
Docker 18.06.2のインストール
kubernetesソースコードに従って特定のdockerバージョンをインストール
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=http://mirror.azure.cn/docker-ce/linux/centos/gpg
EOF
yum install -y docker-ce-18.06.2.ce-3.el7.x86_64
# docker加速を設定
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl start docker
systemctl enable docker.service
その他の依存関係のインストール
1
2
yum -y install yum nfs-utils wget nano yum-utils device-mapper-persistent-data lvm2 git docker-compose ipvsadm net-tools telnet
yum update -y
install-kubeadm
k8sミラーを設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[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
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
# && systemctl start kubelet
クラスターのインストール
次に、実際の状況に応じて単一のmasterまたは奇数のmasterを選択します。
kubeadmのデフォルト設定ファイルはkubeadm config print init-defaultsとkubeadm config print join-defaultsに「隠されています」。ここでは、中国の特色のある実際の状況に応じて変更する必要があります。
1
2
kubeadm config print join-defaults --component-configs KubeProxyConfiguration //JoinConfiguration KubeProxyConfiguration
kubeadm config print join-defaults --component-configs KubeletConfiguration // JoinConfiguration KubeletConfiguration
一般的に、serviceSubnetの範囲はpodSubnetより小さくする必要があります。
podSubnet: 10.66.0.0/16は最大65534のpodしか持てないことを意味し、serviceSubnetも同様です。
高可用性タイプ(本番環境用)
高可用性の特徴は、N個のetcd、kube-apiserver、kube-scheduler、kube-controller-managerで、コンポーネントの冗長性を高可用性の基礎として使用します。
api-serverはロードバランサーを外部エントリーポイントとして使用します。
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
# https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1#ClusterConfiguration
export HOST0=172.18.221.35
export HOST1=172.18.243.72
export HOST2=172.18.243.77
mkdir -p ${HOST0}/ ${HOST1}/ ${HOST2}/
ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=("infra0" "infra1" "infra2")
for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > ${HOST}/kubeadm-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: "kubeadm.k8s.io/v1beta1"
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
imageRepository: gcr.azk8s.cn/google_containers
# ここでは阿里云内網ロードバランサーをエントリーポイントとして設定しました。ない場合は無視してください
# controlPlaneEndpoint: "172.18.221.7:6443"
networking:
# pod CIDRを計画
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --ignore-preflight-errors=all
# todo:
kubeadm join 172.18.221.35:6443 --token l0ei3n.rqqqseno29oo564z \
--discovery-token-ca-cert-hash sha256:9752be9ff3b619f5b6baadc98ed184e3e1dc2ff02b080aea2457b8f89496de2f
単一masterタイプ(実験用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo tee kubeadm-config.yaml <<-'EOF'
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
# ここでは阿里云内網ロードバランサーをエントリーポイントとして設定しました。ない場合は無視してください
# controlPlaneEndpoint: "172.18.221.7:6443"
imageRepository: gcr.azk8s.cn/google_containers
networking:
# pod CIDRを計画
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
EOF
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
kubeletクライアントの設定
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
ネットワークプラグインの設定
ここではquay.io/coreos/flannel:v0.11.0-amd64を選択しました。アーキテクチャが比較的完全なためです
他のmasterノードの導入(高可用性版)
kubeadm initの出力に、次の行があります:
1
[upload-certs] Using certificate key: 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
コピーして、他のmasterでコマンドを実行します:
1
2
3
4
5
kubeadm join 172.18.221.35:6443 \
--token 29ciq3.5mtkr4nzc11mlzd6 \
--discovery-token-ca-cert-hash sha256:03b46745a1f3887417270e33fc9b3fb5ddd82599f0d0ec789ed4edf2c310faae \
--experimental-control-plane \
--certificate-key 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
ワーカーノードがクラスターに参加
1
2
kubeadm join 172.18.221.35:6443 --token c63abt.45sn8bhyxxo2lh0r \
--discovery-token-ca-cert-hash sha256:891e41e798c29f7235078479ca3e0622594c91db08160bea620f60fffcd558f5
最終作業
1
ipvsadm -l
その他の参考
[kubelet-check] Initial timeout of 40s passed.
1
2
systemctl status kubelet
journalctl -xeu kubelet
上記のいずれかのコマンドを通じて、kubernetesサービスは起動中ですが、ノードが見つからないことを示しています。
1
May 20 14:55:22 xxx kubelet[3457]: E0520 14:55:22.095536 3457 kubelet.go:2244] node "xxx" not found
最後に、最初にロードバランサーが指定され、ロードバランサーの接続タイムアウトがタイムアウトを引き起こしたことがわかりました。
–ignore-preflight-errors=all
ドライバー変更後の注意事項
dockerが以前にインストールされていた場合は、設定を変更してサービスを再起動するだけです。
systemdに変更するには、kubeletサービスに1つ以上のパラメータを追加する必要があります。そうしないと、サービスを起動できません。
1
2
3
4
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
1
2
3
4
# Dockerを再起動。
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
masterがスケジューリングに参加
1
2
# masterのtaintを削除し、スケジューリングに参加させる
kubectl taint $node --all node-role.kubernetes.io/master-
リセット
1
2
kubeadm reset
ipvsadm --clear
discovery-token-ca-cert-hashの再計算
1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
todo
https://github.com/kubernetes/kubeadm/issues/1331
参考リンク
Инфраструктура
centos 7.6 64-бит
Версия ядра: 5.1.3-1.el7.elrepo.x86_64 (обновлено вручную, опционально)
kubeadm
kubelet
node*3
Начальная подготовка
репозиторий Mirror
1
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
Обновление ядра
1
2
3
4
5
6
7
8
9
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-ml
# Изменить загрузку
# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
sed -i 's/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
uname -sr
Настройки системы
1
2
3
4
5
6
7
8
9
10
11
# Отключить swap
swapoff -a
# Остановить файрвол
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
# Включить forward
# Docker скорректировал правила файрвола по умолчанию, начиная с версии 1.13
# Отключил цепочку FOWARD в таблице фильтров iptables
# Это вызовет невозможность связи подов между узлами в кластере Kubernetes
iptables -P FORWARD ACCEPT
Включить IPVS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# https://github.com/easzlab/kubeasz/issues/374
# Ядро 4.18 переименовало nf_conntrack_ipv4 в nf_conntrack
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep ip_vs
Установить Docker 18.06.2
Установить конкретную версию docker согласно исходному коду kubernetes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=http://mirror.azure.cn/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=http://mirror.azure.cn/docker-ce/linux/centos/gpg
EOF
yum install -y docker-ce-18.06.2.ce-3.el7.x86_64
# Настроить ускорение docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://vhc6pxhv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl start docker
systemctl enable docker.service
Установить другие зависимости
1
2
yum -y install yum nfs-utils wget nano yum-utils device-mapper-persistent-data lvm2 git docker-compose ipvsadm net-tools telnet
yum update -y
install-kubeadm
Настроить зеркало k8s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo tee /etc/yum.repos.d/kubernetes.repo <<-'EOF'
[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
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
# && systemctl start kubelet
Установить кластер
Далее выберите один master или нечетное количество masters в зависимости от фактической ситуации.
Файл конфигурации по умолчанию kubeadm “скрыт” в kubeadm config print init-defaults и kubeadm config print join-defaults. Здесь измените в соответствии с фактической ситуацией с китайской спецификой.
1
2
kubeadm config print join-defaults --component-configs KubeProxyConfiguration //JoinConfiguration KubeProxyConfiguration
kubeadm config print join-defaults --component-configs KubeletConfiguration // JoinConfiguration KubeletConfiguration
Как правило, диапазон serviceSubnet должен быть меньше, чем podSubnet.
podSubnet: 10.66.0.0/16 означает максимум 65534 пода, то же самое для serviceSubnet.
Тип высокой доступности (для production)
Высокая доступность характеризуется N etcd, kube-apiserver, kube-scheduler, kube-controller-manager, используя избыточность компонентов в качестве основы высокой доступности.
api-server использует балансировку нагрузки в качестве внешней точки входа.
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
# https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1#ClusterConfiguration
export HOST0=172.18.221.35
export HOST1=172.18.243.72
export HOST2=172.18.243.77
mkdir -p ${HOST0}/ ${HOST1}/ ${HOST2}/
ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
NAMES=("infra0" "infra1" "infra2")
for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > ${HOST}/kubeadm-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: "kubeadm.k8s.io/v1beta1"
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
imageRepository: gcr.azk8s.cn/google_containers
# Здесь настроен внутренний балансировщик нагрузки Alibaba Cloud в качестве точки входа, если у вас его нет, пожалуйста, проигнорируйте
# controlPlaneEndpoint: "172.18.221.7:6443"
networking:
# Планировать CIDR пода
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
etcd:
local:
serverCertSANs:
- "${HOST}"
peerCertSANs:
- "${HOST}"
extraArgs:
initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
initial-cluster-state: new
name: ${NAME}
listen-peer-urls: https://${HOST}:2380
listen-client-urls: https://${HOST}:2379
advertise-client-urls: https://${HOST}:2379
initial-advertise-peer-urls: https://${HOST}:2380
EOF
done
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --ignore-preflight-errors=all
# todo:
kubeadm join 172.18.221.35:6443 --token l0ei3n.rqqqseno29oo564z \
--discovery-token-ca-cert-hash sha256:9752be9ff3b619f5b6baadc98ed184e3e1dc2ff02b080aea2457b8f89496de2f
Тип с одним master (для экспериментов)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo tee kubeadm-config.yaml <<-'EOF'
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
# kubernetesVersion: stable
kubernetesVersion: v1.14.2
# Здесь настроен внутренний балансировщик нагрузки Alibaba Cloud в качестве точки входа, если у вас его нет, пожалуйста, проигнорируйте
# controlPlaneEndpoint: "172.18.221.7:6443"
imageRepository: gcr.azk8s.cn/google_containers
networking:
# Планировать CIDR пода
podSubnet: 10.66.0.0/16
serviceSubnet: 10.88.0.0/16
EOF
kubeadm config images pull --config=kubeadm-config.yaml
sudo kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
Настроить клиент kubelet
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
Настроить сетевой плагин
Здесь я выбрал quay.io/coreos/flannel:v0.11.0-amd64, потому что архитектура относительно полная
Добавить другие узлы master (версия высокой доступности)
В выводе kubeadm init есть строка:
1
[upload-certs] Using certificate key: 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
Скопируйте ее, запустите команду на других masters:
1
2
3
4
5
kubeadm join 172.18.221.35:6443 \
--token 29ciq3.5mtkr4nzc11mlzd6 \
--discovery-token-ca-cert-hash sha256:03b46745a1f3887417270e33fc9b3fb5ddd82599f0d0ec789ed4edf2c310faae \
--experimental-control-plane \
--certificate-key 05ae8e3c139a960c6e4e01aebf26869ce5f9abd9fa5cf4ce347e8308b9c276f9
Рабочие узлы присоединяются к кластеру
1
2
kubeadm join 172.18.221.35:6443 --token c63abt.45sn8bhyxxo2lh0r \
--discovery-token-ca-cert-hash sha256:891e41e798c29f7235078479ca3e0622594c91db08160bea620f60fffcd558f5
Заключительная работа
1
ipvsadm -l
Другие ссылки
[kubelet-check] Initial timeout of 40s passed.
1
2
systemctl status kubelet
journalctl -xeu kubelet
Через любую из вышеуказанных команд видно, что хотя служба kubernetes запускается, она указывает, что узел не может быть найден.
1
May 20 14:55:22 xxx kubelet[3457]: E0520 14:55:22.095536 3457 kubelet.go:2244] node "xxx" not found
Наконец выяснилось, что в начале был указан балансировщик нагрузки, и тайм-аут подключения балансировщика нагрузки вызвал тайм-аут.
–ignore-preflight-errors=all
Примечания после изменения драйвера
Если docker был установлен ранее, просто измените конфигурацию и перезапустите службу.
Чтобы изменить на systemd, нужно добавить еще один параметр в службу kubelet, иначе служба не может запуститься.
1
2
3
4
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
1
2
3
4
# Перезапустить docker.
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
Master участвует в планировании
1
2
# Удалить taint master, чтобы позволить ему участвовать в планировании
kubectl taint $node --all node-role.kubernetes.io/master-
Сброс
1
2
kubeadm reset
ipvsadm --clear
Пересчитать discovery-token-ca-cert-hash
1
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
todo
https://github.com/kubernetes/kubeadm/issues/1331
Ссылки
- Обзор kubeadm
- Репозиторий зеркал Alibaba Cloud
- Официальное руководство по установке
- Использование kubeadm для установки kubernetes
- centos7 Установить kubeadm
- centos7 Использовать kubeadm для установки k8s-1.11 версии мульти-мастер высокой доступности
- centos7 Использовать kubeadm для установки кластера k8s
- Сводка исключений установки кластера kubernetes
- Справочное руководство по инструменту настройки kubeadm
- ipvs
💬 讨论 / Discussion
对这篇文章有想法?欢迎在 GitHub 上发起讨论。
Have thoughts on this post? Start a discussion on GitHub.