k8s环境集群环境搭建

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相关的服务是否正常
上一篇:apollo VehicleStateProvider代码分析


下一篇:coredns状态为pending和部署calico报错Init:0/3或Init:RunContainerError