How to setup k8s cluster on ubuntu?
一、设置基本环境(需要开启超级用户权限)
1. 禁止selinux
安装控制selinux的命令:
apt-get install -y selinux-utils
禁止selinux:
setenforce 0
重启操作系统:
shutdown -r now
查看selinux是否已经关闭:
getenforcesudo
显示Disabled表示则已经关闭
2. 关闭swap分区
swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
重启机器后使用free -m查看分区状态swap一行应该都为0,因swap分区重新挂载需要修改文件权限:
mount -o remount rw /
3. 配置网络和主机名
关闭防火墙:
ufw disable
配置DNS:
vi /etc/systemd/resolved.conf并添加DNS=8.8.8.8 211.142.211.124 8.8.8.4
重启网络服务:
8.8.8.8 211.142.211.124 8.8.8.4
添加主机名(每个k8s节点都做相同配置,vi /etc/hostname可修改主机名)以区分主从节点,也可不做此配置:
vi /etc/hosts
172.16.1.34 master
172.16.1.35 worker1
172.16.233.52 worker2
4. 设置ntp确保时钟时间同步
crontab -e 编辑添加以下命令用于每小时更新ntp
* */1 * * * ntpdate time1.aliyun.com
5. 设置kubernetes启动参数
cat >/etc/sysctl.d/kubernetes.conf<
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0 #由于tcp_tw_recycle与kubernetes的NAT冲突,必须关闭!否则会导致服务不通。
vm.swappiness=0 #禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1 #关闭不使用的ipv6协议栈,防止触发docker BUG.
net.netfilter.nf_conntrack_max=2310720
EOF
6. kube-proxy开启ipvs的前置条件
modprobe br_netfilter
cat >ipvs.sh<< EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x ipvs.sh && sh ipvs.sh
lsmod | grep ip_vs
二、安装docker
1. 安装 apt 依赖包,用于通过HTTPS来获取仓库,更新apt源
apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
2. 添加 Docker 的官方 GPG 密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
验证添加的密钥是否成功:
apt-key fingerprint 0EBFCD88
3. 设置稳定版docker下载源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
4. 查看docker版本,选择要安装的docker版本
apt-cache madison docker-ce
5. 安装docker-ce指定版本
apt-get install docker-ce=18.06.0~ce~3-0~ubuntu
查看安装是否成功
docker --version
6. 修改docker的cgroup driver,并设置为阿里云源
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://f3lu6ju1.mirror.aliyuncs.com"]
}
EOF
7. 设置开机自启并重启docker
systemctl enable docker
systemctl daemon-reload && systemctl restart docker
三、安装 kubectl、kubelet、kubeadm
1. 添加阿里云k8s源
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
2. 查看可安装版本
apt-cache madison kubectl
3. 安装指定版本的kubelet、kubeadm、kubectl
apt-get install -y kubelet=1.17.0-00 kubeadm=1.17.0-00 kubectl=1.17.0-00
查看安装是否成功
kubectl version
kubeadm version
4. 设置开机自启
systemctl enable kubelet.service
5. 配置kubelet禁用swap,并重启
tee /etc/default/kubelet <
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
systemctl daemon-reload && systemctl restart kubelet
四、开始部署k8s集群
1. 下载k8s的基础镜像
vi pullimages.sh
将以下内容添加到 pullimages.sh 中
#!/bin/bash
kubeadm config images list > /root/.a.txt
for i in $( cat /root/.a.txt )
do
docker pull registry.aliyuncs.com/google_containers/${i#*/}
docker tag registry.aliyuncs.com/google_containers/${i#*/} k8s.gcr.io/${i#*/}
docker rmi registry.aliyuncs.com/google_containers/${i#*/}
done
echo "all initilized docker images download done, please use 'docker images' to check"
给pullimages.sh脚本赋予执行权限,并执行脚本
chmod +x pullimages.sh && sh pullimages.sh
等待脚本执行完毕后,可以通过以下命令,查看已经拉去到的初始镜像
docker images
以上操作在master和node节点都需要做,以下操作分master和node
2. master节点初始化
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.17.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.16.15.43 | tee kubeadm-init.log
机器重启后可能需要重启kubelet和docker
systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet
如果还不行需要用“kubeadm reset”先重置kubernets服务再"kubeadm init ..."
根据提示设置master节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
验证kubernetes启动结果
kubectl get nodes -n kube-system
PS : 注意显示master状态是NotReady,证明初始化服务器成功
允许mster节点部署pod(可选):
kubectl taint nodes --all node-role.kubernetes.io/master-
等一两分钟后使用kubectl get nodes命令
可以看到以下master已经激活:
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 3m16s v1.17.0
下载kube-flannel.yml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
s检查kube-flannel.yml文件中net-conf.json的Network参数是否跟kubeadm init时的--pod-network-cidr一致
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
部署flannel网络插件
kubectl apply -f kube-flannel.yml
命令执行完毕后,查看节点状态,显示Ready,即flannel网络插件部署成功;
设置集群只允许部署单个coredns组件:
kubectl scale deployments.apps -n kube-system coredns --replicas=1
查看当前集群状态
kubectl get cs
看到以下显示表示集群处于健康状态:
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
3. node节点加入k8s集群
首先在master机器上执行以下命令:
kubeadm token create --print-join-command
根据生成的kubeadm join命令在,需要加入的node机器上执行该命令,如:
kubeadm join 172.16.15.43:6443 --token gas2fs.8x4bmyk1opibsb3w --discovery-token-ca-cert-hash sha256:343adb6a92e846dcc1dbf5e1b936e7f0350793ebe976cd327e0b3da857326a5c
若机器重启后需重启docker和kubelet服务
systemctl daemon-reload && systemctl restart docker && systemctl restart kubelet
如果还不行需要用“kubeadm reset”先重置kubernets服务再"kubeadm join ..."
等node1加入master后再给node打标签:
kubectl label nodes ${node name} node-role.kubernetes.io/${node role name}=
如:
kubectl label nodes test-super-server node-role.kubernetes.io/worker1=
删除该标签:
kubectl label nodes test-super-server node-role.kubernetes.io/worker1-
当kubelet服务异常时使用一下命令查看错误打印:
systemctl status kubelet
journalctl -xefu kubelet
五、Q&A
1. 解决k8s集群在master节点“kubeadm reset”再"kubeadm init ..."之后运行kubectl出现的错误:
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
rm $HOME/.kube -fr
再次执行
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
即可。
2. 解决k8s集群在worker节点运行kubectl出现的错误:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
root@k8s-master1:# scp -r /etc/kubernetes/admin.conf ${node1}:/tmp
root@k8s-node1:# mv /tmp/admin.conf /etc/kubernetes/ root@k8s-node1:# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile root@k8s-node1:# source ~/.bash_profile
之后在worker节点多终端执行kubectl命令只需要source ~/.bash_profile一下即可