篇一:Kubernetes集群部署
环境:
K8S版本:v1.19.3
名称 | 系统 | IP | 主机名 |
---|---|---|---|
Master | CentOS 7.8.2003 x86_64 | 172.16.135.10 | k8s-master01 |
Node01 | CentOS 7.8.2003 x86_64 | 172.16.135.11 | k8s-node01 |
Node02 | CentOS 7.8.2003 x86_64 | 172.16.135.12 | k8s-node02 |
Node03 | CentOS 7.8.2003 x86_64 | 172.16.135.13 | k8s-node03 |
备注:此集群仅用于测试使用,不可用户生产环境。生产环境需要考虑Master节点的高可用,且需要做适当的优化,后面可能会写一篇文章单独说
环境配置
时间同步
K8S集群应保持时间同步,避免出现奇怪的问题。
# 在所有节点上执行
yum install chrony
systemctl start chronyd
systemctl enable chronyd
关闭swap
k8s默认不允许主机开启swap,这里将其关闭。如果需要启用swap忽略错误,需要在kubelet启动参数上添加--ignore-preflight-errors=Swap
。或者修改/etc/sysconfig/kubelet
,KUBELET_EXTRA_ARGS="--fail-swap-on=false"
关闭swap
# 在所有节点上执行
# 修改 /etc/fstab,注释swap一行
# 然后执行swapoff命令立即关闭swap
swapoff -a
防火墙配置
我习惯于使用iptables作为防火墙配置工具,因此禁用默认的firewalld,启用iptables,且将默认规则做了一些删减,以免出现网络不通的情况,需要根据自身情况配置
# 在所有节点上执行
systemctl stop firewalld
systemctl disable firewalld
yum install -y iptables-services
cat > /etc/sysconfig/iptables << EOF
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT
EOF
systemctl start iptables
systemctl enable iptables
安装docker
# 在所有节点上执行
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker
安装kubelet、kubeadm、kubectl
# 在所有节点上执行
cat > /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
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
systemctl enable kubelet
systemctl start kubelet
下载k8s所需镜像
官方镜像站点是k8s.gcr.io,由于网络问题,k8s.gcr.io
访问不了,因此我们需要从其它镜像仓库上下载k8s镜像,这里从阿里云上下载
# 在master上执行,如果你安装的不是1.19.3版本,则需要修改version的值
cat > images.sh << "EOF"
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.19.3
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
EOF
sh images.sh
# 在node上执行,如果你安装的不是1.19.3版本,则需要改version的值
# 因为node仅需要kube-proxy pause coredns这三个镜像,因此和master下载的镜像不一样,你也可以用master那个images.sh下载全部镜像
cat > images.sh << "EOF"
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.19.3
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
i=$(echo $imagename|awk -F: '{print $1}')
case $i in
kube-proxy|pause|coredns)
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
;;
esac
done
EOF
sh images.sh
初始化集群
# 如果你安装的不是1.19.3版本,则需要修改--kubernetes-version的值
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm init --kubernetes-version=v1.19.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
初始化成功会输出以下内容:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.16.135.10:6443 --token foqdxx.4495z6spg7tohq5d \
--discovery-token-ca-cert-hash sha256:14e6fad9c4aa1143083783d8cf84eefe067976c14c5628a8fd38199208689e0f
我们要按照他的指示操作
# 在master上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 在所有node上执行
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
kubeadm join 172.16.135.10:6443 --token foqdxx.4495z6spg7tohq5d \
--discovery-token-ca-cert-hash sha256:14e6fad9c4aa1143083783d8cf84eefe067976c14c5628a8fd38199208689e0f
这个token会过期,如果后续要将主机加入集群,执行以下命令获取新的token
kubeadm token create --print-join-command
安装flannel网络插件
# 在master上执行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
网络插件会从quay.io
上下载镜像,网速会比较慢,而且不稳定,这个步骤可能会卡住很久。我们可以手动将镜像pull到本地
# 在所有节点上执行
docker pull quay.io/coreos/flannel:v0.13.0
# flunnel的版本可能会更新,可以使用命令查看当前所需版本,在master上执行
kubectl describe ds kube-flannel -n kube-system | grep Image
查看集群状态:
kubectl get node
当主机状态为Ready
则表示集群状态正常
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready master 72m v1.19.3
k8s-node01 Ready <none> 70m v1.19.3
k8s-node02 Ready <none> 70m v1.19.3
k8s-node03 Ready <none> 70m v1.19.3
配置kubectl命令自动补全
在日常的管理中,会经常使用到kubectl
命令,配好命令补全可以大大提高命令的输入速度
# 在master上执行
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
这样就可以按tab
键补全命令啦!