使用kubeadm搭建K8s集群

01 使用kubeadm搭建K8s集群

1.1 版本选择

centos7
Docker Community: 20.10.7
K8s Version: v1.23.14
Calico Version: v3.20

1.2 准备台centos机器

配置要求:每台机器至少2C2G,不然运行不起来

192.168.0.51   master

192.168.0.52   worker01

192.168.0.53   worker02

1.3 安装Docker

3台机器

参考Docker安装文档[略]

1.4 安装依赖和更新

3台机器

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

1.5 修改hosts文件

(1)master

sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.0.51 m
192.168.0.52 w1
192.168.0.53 w2

(2)2台worker

sudo hostnamectl set-hostname w1/w2
vi /etc/hosts
192.168.0.51 m
192.168.0.52 w1
192.168.0.53 w2

(3)彼此ping测试一下

1.6 系统基础配置

3台机器

# (1)关闭防火墙
    systemctl stop firewalld && systemctl disable firewalld
​
# (2)关闭selinux
    【SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。】
​
    setenforce 0
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
​
# (3)关闭swap
    【在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。】
​
    swapoff -a
    sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
​
# (4)配置iptables的ACCEPT规则
    iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
​
# (5)设置系统参数
cat <  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
​
sysctl --system

1.7 配置K8s的yum源

3台机器

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

1.8 安装kubeadm、kubectl和kubelet

3台机器

kubeadm: the command to bootstrap the cluster.

kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.

kubectl: the command line util to talk to your cluster.

(1)列出可以安装的版本

yum list kubeadm --showduplicates | sort -r

(2)安装kubeadm、kubectl和kubelet

yum install -y kubeadm-1.23.14 kubelet-1.23.14 kubectl-1.23.14

1.9 设置Docker与K8s为同一个cgroup

3台机器

(1)Docker

# docker
vi /etc/docker/daemon.json
​
# 添加这行
"exec-opts": ["native.cgroupdriver=systemd"],
​
# 重启docker
systemctl restart docker

(2)K8s

# kubelet
    sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
​
# 重启kubelet
    systemctl restart kubelet && systemctl enable kubelet

1.10 准备安装K8s组件需要的image

3台机器

1.10.1 查看Components的镜像

kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6

1.10.2 解决镜像不能拉取的思路

我已经在阿里镜像仓库已经将具体的镜像下载好了,按照如下步骤下载转换一下即可

3台机器

sh ./kubeadm-pull-image.sh

#!/bin/bash
​
set -e
​
KUBE_VERSION=v1.23.14
KUBE_PAUSE_VERSION=3.6
ETCD_VERSION=3.5.5-0
​
​
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/jack-kubernetes
GCR_URL=k8s.gcr.io
​
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}
)
​
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 pull registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6
docker tag registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6 
docker rmi registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 

1.11 搭建Master

Master Node

(1)初始化Master

kubeadm init --kubernetes-version=1.23.14 --apiserver-advertise-address=192.168.0.51 --pod-network-cidr=10.244.0.0/16

(2)记录下join的内容

kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \
        --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0

(3)根据日志提示进行如下操作

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

(4)查看cluster-info和健康检查

kubectl cluster-info
curl -k https://localhost:6443/healthz

(5)查看系统Pod

kubectl get pods -n kube-system

(6)kube init流程

# 进行一系列检查,以确定这台机器可以部署kubernetes

# 生成kubernetes对外提供服务所需要的各种证书可对应目录
    ls /etc/kubernetes/pki/*

# 为其他组件生成访问kube-ApiServer所需的配置文件
    ls /etc/kubernetes/
    
# 生成master节点需要的Pod文件。
    ls /etc/kubernetes/manifests/*.yaml
    
# 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。
# master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来

# 为集群生成一个bootstrap token

# 将ca.crt等master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用

# 最后一步是安装默认插件。kubernetes默认kube-proxy和DNS两个插件是必须安装的

(7)安装calico网络插件

# 选择网络插件
    https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
# calico网络插件
    https://projectcalico.docs.tigera.io/getting-started/kubernetes/
    
# 提前拉取镜像
    docker pull docker.io/calico/kube-controllers:v3.20.3
    docker pull docker.io/calico/pod2daemon-flexvol:v3.20.3
    docker pull docker.io/calico/node:v3.20.3
    docker pull docker.io/calico/cni:v3.20.3    
    
# 安装calico:v3.20
    kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml   
    
# 查看calico是否安装成功
    watch kubectl get pods --all-namespaces

1.12 搭建Worker Node

(1)查看node状态

kubectl get nodes

(2)在2台worker node上执行

kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \
        --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0

(3)查看node状态

kubectl get nodes -w

1.13 K8s搭建之后的常见问题

1.13.1 Node NotReady

# 问题描述
    kubectl get nodes
    NAME           STATUS   ROLES                
    k8s-master     Ready    control-plane,master 
    k8s-worker01   NotReady                    
    k8s-worker02   NotReady     

# 问题排查思路
    在NotReady的node上执行:journalctl -f -u kubelet
    查看其出错可能的原因:
        (1)kubelet服务没有设置为开机启动:systemctl restart kubelet && systemctl enable kubelet
        (2)网络环境发生了变化
        (3)机器资源不足
        ...                                               

1.13.2 Worker如何使用kubectl

# 问题描述,在w1节点上通过kubectl get pods查看资源,发现报错
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    
# 解决方案
    需要在worker节点上添加可以操作集群的权限,具体设置如下:
        切换到master上,cd ~  --->  cat .kube/config  --->复制内容
        切换到worker02上   cd ~  --->  新建文件 .kube/config   --->粘贴内容                       

1.13.3 token忘记了怎么办

# token是用于worker节点加入master节点的凭证,默认有效期是24小时,格式如下
    kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \
            --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0
​
# 查看token是否还在有效期内
    kubeadm token list  
    [root@~]#  kubeadm token list
    TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                               
    ykv2ae.fsa5wj7rrxrm1xsd   21h         2022-12-06T06:17:45Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'. 
    
# 如果在有效期内,则生成一个token-hash,和token一起组成用于join的内容
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    
# 如果token已经过期了,则先生成一个新的token和token-hash,用于join的内容
    kubeadm token create --print-join-command  
    kubeadm token list  
    
# 默认token有效期是24小时,如果想设置有效期,则可以通过--ttl来设置,0表示永不过期
    kubeadm token create --print-join-command --ttl=0
   
# 如果要删除token,则执行如下命令
    kubeadm token delete 3nc3wu.pfn3mlgxafuut606                                                                                 

你可能感兴趣的:(docker,kubernetes,容器,云原生)