Kubernetes 1.21.1集群1M2W 环境搭建

Kubernetes 1.21.1集群1M2W 环境搭建

集群说明

操作系统& 内核 ip 角色 kubeadm version docker version
Centos7 3.10.0-1160.25.1.el7.x86_64 192.168.56.186 Master 1.21.1 20.10.7
Centos7 3.10.0-1160.25.1.el7.x86_64 192.168.56.187 worker 1.21.1 20.10.7
Centos7 3.10.0-1160.25.1.el7.x86_64 192.168.56.188 worker 1.21.1 20.10.7

官方参考

官网:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

GitHub:https://github.com/kubernetes/kubeadm

配置要求

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

每个节点的检查环节

MAC 地址唯一性

  • 你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
# mac 地址校验
ifconfig -a

product_uuid 的唯一性

  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。

#  product_uuid 校验
sudo cat /sys/class/dmi/id/product_uuid

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

[root@w2 ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

系统版本统一

内核版本

Docker 要求 CentOS 系统的内核版本高于 3.10

$ uname -r
3.10.0-1160.25.1.el7.x86_64

系统基础前提配置

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# 时钟同步
yum install ntpdate -y && ntpdate time.windows.com

网络配置

访问外网

每个节点需要开启NAT网络模式,可访问宿主机的外网环境

配置网卡网段

大家根据自己的情况来准备centos7的虚拟机。

要保证彼此之间能够ping通,也就是处于同一个网络中

也可以按如下操作:

虚拟机开启Host-Olny模式,默认会开启56网段

三台机器配置同网段的虚拟网卡-ifcfg-enp0s8

#进入网卡配置路径下
[root@bogon network-scripts]# cd /etc/sysconfig/network-scripts/
[root@bogon network-scripts]# ls
ifcfg-enp0s8  ifdown-ippp    ifdown-Team      ifup-ib     ifup-ppp       init.ipv6-global
ifcfg-enp0s9  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes    network-functions
ifcfg-lo      ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit       network-functions-ipv6
ifdown        ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep   ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth    ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib     ifdown-sit     ifup-eth         ifup-post   ifup-wireless

186机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b686
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.186
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

187机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b687
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.187
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

188机器

[root@bogon network-scripts]# vi ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=2f812198-74d6-4d6a-9fcd-8f6d1058b688
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.188
GETEWAY=192.168.56.1
NETMASK=255.255.255.0

修改hosts文件

三台机器设置hosts

vi /etc/hosts
192.168.56.186 m
192.168.56.187 w1
192.168.56.188 w2

设置hostname,也就是用别名替代IP

# 设置186的hostname
sudo hostnamectl set-hostname m
# 设置187的hostname
sudo hostnamectl set-hostname w1
# 设置188的hostname
sudo hostnamectl set-hostname w2

使用ping测试一下

ping m
ping w1
ping w2

每个节点安装docker和kube

更新并安装依赖

3台机器都需要执行

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

安装Docker

官方参考

官方安装手册 https://docs.docker.com/engine/install/centos/

在每一台机器上都安装好Docker,版本为20.10.7

01 安装必要的依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

02 设置docker仓库
	sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
	
【设置要设置一下阿里云镜像加速器】
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这边替换成自己的实际地址"]
}
EOF
sudo systemctl daemon-reload

03 安装docker
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io


04 启动docker&开机运行docker
	sudo systemctl start docker && sudo systemctl enable docker

安装kubeadm, kubelet, kubectl

配置yum源

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

yum  makecache -y fast

安装kubeadm&kubelet&kubectl

#安装 &开机启动kubelet & 启动kubelet
yum install -y kubectl-1.21.1 kubelet-1.21.1 kubeadm-1.21.1
systemctl enable kubelet
systemctl start kubelet

docker和k8s设置同一个cgroup

# docker
vi /etc/docker/daemon.json
    "exec-opts": ["native.cgroupdriver=systemd"],
    
systemctl restart docker
    
# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

使用阿里云下载镜像

查看kubeadm使用的镜像

可以发现这里都是国外的镜像

kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

解决国外镜像不能访问的问题

使用阿里云拉取镜像后修改tag为k8s需要的镜像

  • 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像

vi kubeadm.sh

  #!/bin/bash
  set -e
  KUBE_VERSION=v1.21.1
  KUBE_PAUSE_VERSION=3.4.1
  ETCD_VERSION=3.4.13-0
  CORE_DNS_VERSION=1.8.0
  
  GCR_URL=k8s.gcr.io
  ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
  
  images=(kube-proxy:${KUBE_VERSION}
  kube-scheduler:${KUBE_VERSION}
  kube-controller-manager:${KUBE_VERSION}
  kube-apiserver:${KUBE_VERSION}
  pause:${KUBE_PAUSE_VERSION}
  etcd:${ETCD_VERSION}
  coredns:${CORE_DNS_VERSION})
  
  for imageName in ${images[@]} ; do
    docker pull $ALIYUN_URL/$imageName
    docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
    docker rmi $ALIYUN_URL/$imageName
  done
  
  docker tag k8s.gcr.io/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
  echo '镜像下载成功,将打印镜像列表';
  docker images|grep k8s.gcr.io
  echo '将执行 kubeadm config images list';
  kubeadm config images list
  echo '请对比镜像的名称和tag';
  • 运行脚本和查看镜像
# 运行脚本
sh ./kubeadm.sh
  • 对比镜像的名称和tag

Master初始化过程

kube初始化master

注意此操作是在主节点上进行

初始化master节点

官网:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

本地已有 kubeadm config images list 包含的镜像了,执行以下命令

记得保存执行 init 成功最后kubeadm join的信息

# 执行init
kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1 --apiserver-advertise-address=192.168.56.186

# 若一次没成功,要重新初始化集群状态:执行 kubeadm reset,进行上述操作
# 安装好后返回如下信息,后面会使用到
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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8 

记录你的kubeadm join的命令

kubeadm join 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8 

要开始使用集群了,根据提示执行如下

# 非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

此时kubectl cluster-info查看一下是否成功

查看pod验证一下

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

注意:coredns没有启动,需要安装网络插件

kubectl get pods -n kube-system
NAME                        READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-7zfht    0/1     Pending   0          5m56s
coredns-558bd4d5db-95k88    0/1     Pending   0          5m56s
etcd-m                      1/1     Running   0          6m9s
kube-apiserver-m            1/1     Running   0          6m9s
kube-controller-manager-m   1/1     Running   0          6m9s
kube-proxy-nfvcr            1/1     Running   0          5m56s
kube-scheduler-m            1/1     Running   0          6m8s
# 上面coredns模块没有启动,需要后面安装网络插件

健康检查

curl -k https://localhost:6443/healthz
ok

部署calico网络插件

选择网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/

calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

calico,同样在master节点上操作

# 在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

# 确认一下calico是否安装成功
kubectl get pods --all-namespaces -w

工作节点加入集群

kube worker join cluster

还记得初始化master节点的最后打印信息

拿着上面init执行的命令到worker node进行执行

kubeadm join 192.168.56.186:6443 --token 71h03b.psh05o31axvp09jg \
	--discovery-token-ca-cert-hash sha256:5ed285e40f048e923d4a0e06dfeaac7f3ffcf20bed6402ee3fec1ee4b42d14d8

在woker01和worker02上执行上述命令

在master节点上检查集群信息

kubectl get nodes

NAME                   STATUS   ROLES    AGE     VERSION
master-kubeadm-k8s     Ready    master   19m     v1.14.0
worker01-kubeadm-k8s   Ready    <none>   3m6s    v1.14.0
worker02-kubeadm-k8s   Ready    <none>   2m41s   v1.14.0

此时node的STATUS开始是NoReady,此时集群正在建立连接,通过如下命令查看过程

需要等待片刻

kubectl get pods --all-namespaces -w
NAMESPACE         NAME                                       READY   STATUS     RESTARTS   AGE
kube-system       calico-kube-controllers-76bf499b46-mxv6q   0/1     Pending    0          47s
kube-system       calico-node-fn8mx                          0/1     Init:0/3   0          48s
kube-system       calico-node-mpmpt                          0/1     Init:0/3   0          48s
kube-system       calico-node-v4hpf                          0/1     Init:0/3   0          48s
kube-system       coredns-558bd4d5db-7zfht                   0/1     Pending    0          46m
kube-system       coredns-558bd4d5db-95k88                   0/1     Pending    0          46m
kube-system       etcd-m                                     1/1     Running    0          46m
kube-system       kube-apiserver-m                           1/1     Running    0          46m
kube-system       kube-controller-manager-m                  1/1     Running    0          46m
kube-system       kube-proxy-2svlm                           1/1     Running    0          21m
kube-system       kube-proxy-nfvcr                           1/1     Running    0          46m
kube-system       kube-proxy-tpqlk                           1/1     Running    0          21m
kube-system       kube-scheduler-m                           1/1     Running    0          46m
tigera-operator   tigera-operator-86c4fc874f-kw2dd           1/1     Running    0          31m

等待所有的status变成Running,node的状态才会变成Ready

都变成Ready状态后集群即搭建成功。

验证阶段

发布Pod,验证集群安装状态

定义pod.yml文件,比如pod_nginx_rs.yaml

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

根据pod_nginx_rs.yml文件创建pod

kubectl apply -f pod_nginx_rs.yaml 
replicaset.apps/nginx created

查看pod

kubectl get pods
# 需等待1分钟 才有如下结果
NAME          READY   STATUS    RESTARTS   AGE
nginx-2zl2r   0/1     Pending   0          66s
nginx-74x6h   0/1     Pending   0          66s
nginx-wbwjx   0/1     Pending   0          66s

#大约2分钟后查看运行详情
kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE   NOMINATED NODE   READINESS GATES
nginx-2zl2r   1/1     Running   0          3m18s   192.168.80.195   w2     <none>           <none>
nginx-74x6h   1/1     Running   0          3m18s   192.168.80.196   w2     <none>           <none>
nginx-wbwjx   1/1     Running   0          3m18s   192.168.190.66   w1     <none>           <none>

# 查看详细的运行情况
kubectl describe pod nginx

验证nginx

# 在集群内运行一下三行都可以返回结果
curl 192.168.80.195
curl 192.168.80.196
curl 192.168.190.66

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

删除pod

kubectl delete -f pod_nginx_rs.yaml
上一篇:旋转矩阵和变换矩阵的概念和区别


下一篇:虚拟化(KVM)介绍以及网卡配置