K8s集群安装部署(CentOS系统)
一. 安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
1、一台或多台机器,操作系统 CentOS7.x-86_x64
2、硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
3、集群中所有机器之间网络互通
4、可以访问外网,需要拉取镜像
5、禁止swap分区
6、有docker环境
二. 所有节点准备环境
1、【所有节点】关闭防火墙:
systemctl stop firewalld #暂停防火墙
systemctl disable firewalld #设置开机禁用防火墙
systemctl status firewalld #检查防火墙状态
2、【所有节点】关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config #selinux为disabled
setenforce 0 #设置SELinux 成为permissive模式(许可模式)
3、【所有节点】关闭swap:
swapoff -a #将/etc/fstab文件中所有设置为swap的设备关闭,立即生效
vim /etc/fstab $ 永久
将 /dev/mapper/centos-swap swap swap default 0 0 这一行前面加个 # 号将其注释掉 #设置后开机后就不会开启swap功能
4、【所有节点】添加主机名与IP对应关系(记得设置主机名):
设置主机名:(此步可以按需求设置,对应host文件)
hostnamectl set-hostname 主机名字 #设置主机名
hostname #查看当前主机名
注意:设置完后需要reboot才能生效。
5.【所有节点】更改host文件
$ vi /etc/hosts
172.16.x.xx master
172.16.x.xx node1
172.16.x.xx node2
6.【所有节点】将桥接的IPv4流量传递到iptables的链:
有一些ipv4的流量不能走iptables链,linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,导致流量丢失
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
$ sysctl --system #手动加载所有的配置文件
7.【所有节点】添加阿里云YUM软件源
GFW原因访问国外资源比较慢,所以这里需要借助国内源来实现加速效果
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
三.安装必要组件
【所有节点】安装kubeadm,kubelet和kubectl
yum install -y kubeadm-1.20.5 kubelet-1.20.5 kubectl-1.20.5 #安装kubeadm、kubelet、kubectl
systemctl enable kubelet # 启动服务并设置开机自启动
四. 安装kubernetes Master
1、[ Master节点 ]执行部署Kubernetes Master
注意将apiserver-advertise-address的ip地址更改为本机ip
kubeadm init --kubernetes-version v1.20.5 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.233.0.0/16 --apiserver-advertise-address=192.168.4.39
回显结果要保存,后面node加入master需要用到
参数说明:
- kubernetes-version: 安装指定版本的 k8s 版本,该参数和 kubeadm 的版本有关,特定版本的 kubeadm 并不能安装所有版本的 k8s,最好还是 kubeadm 的版本和该参数指定的版本一致。
- image-repository: 该参数仅在高版本(具体哪个版本没仔细查,反正在 1.13.x 中是支持的)的 kubeadm 中支持,用来设置 kubeadm 拉取 k8s 各组件镜像的地址,默认拉取的地址是:k8s.gcr.io。众所周知 k8s.gcr.io 国内是无法访问的,所以在这里改为阿里云镜像仓库。
- pod-network-cidr: 设置 pod ip 的网段 ,网段之所以是 10.244.0.0/16,是因为后面安装 flannel 网络插件时,yaml 文件里面的 ip 段也是这个,两个保持一致,不然可能会使得 Node 间 Cluster IP 不通。这个参数必须得指定,如果这里不设置的话后面安装 flannel 网络插件时会报如下错误:
E0317 17:02:15.077598 1 main.go:289] Error registering network: failed to acquire lease: node "k8s-master" pod cidr not assigned
-
apiserver-advertise-address: API server 用来告知集群中其它成员的地址,这个参数也必须得设置,否则 api-server 容器启动不起来,该参数的值为 master 节点所在的本地 ip 地址。
kubeadm 以后将会在 /etc 路径下生成配置文件和证书文件
[root@k8s-master etc]# tree kubernetes/
kubernetes/
├── admin.conf
├── controller-manager.conf
├── kubelet.conf
├── manifests
│ ├── etcd.yaml
│ ├── kube-apiserver.yaml
│ ├── kube-controller-manager.yaml
│ └── kube-scheduler.yaml
├── pki
│ ├── apiserver.crt
│ ├── apiserver-etcd-client.crt
│ ├── apiserver-etcd-client.key
│ ├── apiserver.key
│ ├── apiserver-kubelet-client.crt
│ ├── apiserver-kubelet-client.key
│ ├── ca.crt
│ ├── ca.key
│ ├── etcd
│ │ ├── ca.crt
│ │ ├── ca.key
│ │ ├── healthcheck-client.crt
│ │ ├── healthcheck-client.key
│ │ ├── peer.crt
│ │ ├── peer.key
│ │ ├── server.crt
│ │ └── server.key
│ ├── front-proxy-ca.crt
│ ├── front-proxy-ca.key
│ ├── front-proxy-client.crt
│ ├── front-proxy-client.key
│ ├── sa.key
│ └── sa.pub
└── scheduler.conf。
2、[ Master节点 ]配置可以使用kubectl工具:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。
如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。
### 3、[ 所有节点 ]加入Kubernetes Node
> 在所有【Node】节点执行。 注意!!! 执行此操作前需要安装[calico网络插件](五.安装calico网络插件)
>
> 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:这个在master init初始化时会有提示,更换为自己master的IP和token。
例如:
```shell
kubeadm join 192.168.x.x:6443 --token 8rzfx1.0mliir0mjure3cq0 \
--discovery-token-ca-cert-hash sha256:cf6496e029192677b6761569f8d6e1088287d27447598dd57cb01809829ecea2
节点加入kubernetes后检查node状态
$ kubectl get nodes
在调试 Kubernetes 集群时,最重要的手段就是用 kubectl describe 来查看这个节点(Node)对象的详细信息、状态和事件(Event),我们来试一下:
$ kubectl describe node master
...
Conditions:
...
Ready False ... KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
通过 kubectl describe 指令的输出,我们可以看到 NodeNotReady 的原因在于,我们尚未部署任何网络插件。
五.安装calico网络插件
1.【master节点】下载 Calico 配置文件
curl https://docs.projectcalico.org/v3.9/manifests/calico-etcd.yaml -O
2.修改etcd配置
# 修改网络配置
POD_CIDR=`grep 'cluster-cidr' /etc/kubernetes/manifests/kube-controller-manager.yaml | awk -F= '{print $2}'`
sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico-etcd.yaml
3.修改证书
sed -i 's/# \(etcd-.*\)/\1/' calico-etcd.yaml
etcd_key=$(cat /etc/kubernetes/pki/etcd/peer.key | base64 -w 0)
etcd_crt=$(cat /etc/kubernetes/pki/etcd/peer.crt | base64 -w 0)
etcd_ca=$(cat /etc/kubernetes/pki/etcd/ca.crt | base64 -w 0)
sed -i -e 's/\(etcd-key: \).*/\1'$etcd_key'/' \
-e 's/\(etcd-cert: \).*/\1'$etcd_crt'/' \
-e 's/\(etcd-ca: \).*/\1'$etcd_ca'/' calico-etcd.yaml
4.修改 etcd 地址
ETCD=$(grep 'advertise-client-urls' /etc/kubernetes/manifests/etcd.yaml | awk -F= '{print $2}')
sed -i -e 's/\(etcd_.*:\).*#/\1/' \
-e 's/replicas: 1/replicas: 2/' calico-etcd.yaml
5.指定探测网卡
注意:需要将interface值改为master 的网卡
sed '/autodetect/a\ - name: IP_AUTODETECTION_METHOD\n value: "interface=ens192"' -i calico-etcd.yaml
6.修改calico.yaml配置
echo $ETCD #查看etcd的地址
打开calico.yaml文件将data下etcd_endpoints值改为etcd地址
7.开始创建calico
kubectl apply -f calico-etcd.yaml
kubectl get pod/svc/deployment -n kube-system #查看calico相关的服务是否正常