通过kubeadm安装k8s集群
kubeadm官方文档:https://kubernetes.io/zh/docs/home/
机器分布
| hostname | ip | role |
| k8s-cluster-1 | 192.168.66.143 | master |
| k8s-cluster-2 | 192.168.66.144 | worker |
| k8s-cluster-3 | 192.168.66.145 | worker |
环境处理
# 关闭防火墙、禁用SELINUX、关闭
# 关闭防火墙、禁用SELINUX、关闭swap
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
iptables -F
firewall-cmd --state #查看防火墙状态
sudo setenforce 0 #关闭selinux
sed -i 's#=enforcing#=disabled#g' /etc/selinux/config
swapoff -a # 该命令只是临时生效,需要在/etc/fstab配置文件,注释掉swap所在行的设
#一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
如果不想关闭防火墙,请打开以下端口
master节点
| 协议 | 方向 | 端口范围 | 作用 | 使用者 |
| TCP | 入站 | 6443* | Kubernetes API 服务器 | 所有组件 |
| TCP | 入站 | 2379-2380 | etcd server client API | kube-apiserver, etcd |
| TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
| TCP | 入站 | 10251 | kube-scheduler | kube-scheduler 自身 |
| TCP | 入站 | 10252 | kube-controller-manager | kube-controller-manager 自身 |
node节点
| 协议 | 方向 | 端口范围 | 作用 | 使用者 |
| TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
| TCP | 入站 | 30000-32767 | NodePort 服务** | 所有组件 |
安装docker
wget https://get.daocloud.io/docker | sh
或
curl -sSL https://get.daocloud.io/docker | sh
配置kubernetets源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 如果网络不好可以使用阿里源
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
安装kubernetes
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
初始化kubernets
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.66.143
# 参数介绍
# --apiserver-advertise-address API 服务器所公布的其正在监听的 IP 地址
# --pod-network-cidr 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs
# --service-cidr 为服务的虚拟 IP 地址另外指定 IP 地址段
# 执行过程中需要等待一段时间,需要从kubernets的镜像仓库拉取所需要的镜像(etcd,coredns等等)
# 执行完之后会得到一串文本
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:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
#如果是非root用户,需要执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果是root用户执行
export KUBECONFIG=/etc/kubernetes/admin.conf
# 记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将节点加入集群。
以上只需要在master节点执行,执行之后会得到kubedm join 的一串提示,复制,在worker节点输入即可加入集群
如果token过期,请参考官方文档重新生成:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
官方文档:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
安装CNI网络插件
这里我选择是fannel
github地址:https://github.com/coreos/flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 但是由于某种原因,yml文件下载不下来,建议可以从github上把文件拷贝下来,然后复制到master节点上执行
kubectl apply -f kube-fannel.yml
加入kubernets集群
在安装好fannel之后,worker节点可以通过master节点在kube init之后生成的一串文本加入到集群中,命令如下
kubeadm join 192.168.66.143:6443 --token m36exd.thoxv1mxhbtwale8 --discovery-token-ca-cert-hash sha256:b8cd521b46c3845dcc7af249075fc47ab626ea8a202ec31a3f6ac18b3acacd4f
# 查看集群
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-cluster-1 Ready control-plane,master 3h34m v1.20.1
k8s-cluster-2 Ready <none> 3h31m v1.20.1
k8s-cluster-3 Ready <none> 3h29m v1.20.1
之后就可以使用你的kubernets集群了
故障排查
如果在init之后出现问题,通过该命令可以查看kubernets发生的异常日志
journalctl -xeu kubelet
有时候重新连接master节点之后,会提示以下,证书无法验证
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")
如果是root用户,执行
cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source /root/.bashrc
非root用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果.kube/conf已经存在,这直接执行
sudo chown $(id -u):$(id -g) $HOME/.kube/config