1.官方提供两种部署方式

- kubeadm

Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

简化部署,后期维护有难度,需熟悉环境


- 二进制

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群下载地址:https://github.com/kubernetes/kubernetes/releases

2.服务器硬件配置推荐

配置大小决定能跑多少个容器

Kubernetes第二课:kubeadm部署K8s v1.27.6_k8s部署

3Kubernetes  部署步骤

1安装docker

2创建一个Master节点

3将一个Node节点加入到当前集群中

4部署容器网络(CNI)

5部署Web UI(Dashboard)


4使用Kubeadm快速部署k8s集群

4.1安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

一台或多台机器,操作系统 CentOs7.x-86_x64

硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

集群中所有机器之间网络互通

可以访问外网,需要拉取镜像

禁止swap分区

k8s-master

192.168.0.56

k8s-node1

192.168.0.57

k8s-node2

192.168.0.58

4.2Centos前置配置,初始化操作

#关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld 
#熟悉访问规则后配置策略可开启

关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config 永久
setenforce 0  #临时
getenforce   #查看状态

#关闭swap:
swapoff -a #临时
vim /etc/fstab #注释掉swap分区
#/dev/mapper/centos-swap swap swap defaults 0 0

#设置主机名
hostnamectl set-hostname k8s-master
#在node添加host:
hostnamectl set-hostname k8s-node1
bash #生效

#在master添加hosts:     
cat >> /etc/hosts<< EOF
192.168.0.56 k8s-master
192.168.0.57 k8s-node1
192.168.0.58 k8s-node2
EOF

#将桥接的IPv4流量传递到iptables的链
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
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf  #查看是否生效
sysctl -p

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

升级系统内核

https://kernel.org/

Kubernetes第二课:kubeadm部署K8s v1.27.6_kubctl_02

建议使用红框中给出的内核版本

检查系统内核版本
uname -r 

导入公钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装elrepo仓库
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

载入elrepo-kernel元数据
yum --disablerepo=\* --enablerepo=elrepo-kernel repolist

列出elrepo-kernel的rpm包
yum --disablerepo=\* --enablerepo=elrepo-kernel list kernel*

安装指定版本 这里建议安装带有ml标识的版本,为长期稳定版本
yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64

查看内核是否载入到grub2
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

设置新的内核为grub2的默认版本
grub2-set-default 0

编辑 /etc/default/grub 文件设置默认启动版本
cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

生成 grub 配置文件并重启
reboot

最后查看内核是否升级成功
uname -r

yum remove systemd
yum install systemd
重新安装高版本 systemd systemd版本太低会导致k8s安装失败

安装ipset及ipvsadm 

安装ipset及ipvsadm   实现路由汇总和查看,建议安装
yum -y install ipset ipvsadm

写入配置文件 
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

授权、加载、验证是否生效
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 155648  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_netlink    45056  0
nfnetlink              16384  2 nf_conntrack_netlink
nf_conntrack          147456  5 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE,ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
nf_defrag_ipv4         16384  1 nf_conntrack
libcrc32c              16384  4 nf_conntrack,nf_nat,xfs,ip_vs

Kubernetes第二课:kubeadm部署K8s v1.27.6_k8s部署_03

4.3安装docker

#安装docker依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 bash-completion

#配置阿里镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#清除缓存
yum clean all
yum makecache

#安装docker
yum install -y docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
systemctl enable docker

#设置阿里镜像源 编辑/etc/docker/daemon.json
vi /etc/docker/daemon.json  
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
wq
systemctl restart docker 重启服务生效
docker info  查看是否生效

#开始内核转发
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p

安装cri-dockerd

Kubernetes v1.24移除docker-shim的支持,而Docker Engine默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的桥梁,从而能够让Docker作为Kubernetes容器引擎。CRI 容器运行时接口

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_04

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.9-3.el7.x86_64.rpm
#指定依赖镜像源
vi /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd  --container-runtime-endpoint fd://  --pod-infra-container-image=registry.k8s.io/pause:3.9
systemctl daemon-reload #重新加载守护程序
#设置cri-docker开机自启和启动cri-docker
systemctl enable cri-docker && systemctl start cri-docker

4.4安装kubeadm,kubelet和kubectl

添加阿里云镜像

cat /etc/yum.repos.d/k8s.repo <<EOF
[kubernetes]
name=Kubernetes
#baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

查看源指定版本
yum list kubeadm.x86_64 --showduplicates | sort -r
yum list kube.x86_64 --showduplicates | sort -r
yum list kubectl.x86_64 --showduplicates | sort -r

由于版本更新频繁,这里指定版本号部署:推荐安装最新版本 v1.27.6

yum install -y kubelet-1.27.6 kubeadm-1.27.6 kubectl-1.27.6
#
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

systemctl enable kubelet
#注意 kubelet 不是容器化部署的组件,需要本地执行 
#此时kubectl可能会起不来,可以在kubeadm init完成后再启动
#Master和node节点中都需要安装

配置containerd

原因分析

使用安装包安装的containerd会默认禁用作为容器运行时的功能,即安装包安装containerd后默认禁用containerd作为容器运行时 这个时候使用k8s就会报错了,因为没有容器运行时可以用 开启方法就是将/etc/containerd/config.toml文件中的disabled_plugins的值的列表中不包含cri 修改后重启containerd才会生效

原文链接:https://blog.csdn.net/mo_sss/article/details/134855578

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_05

查看containerd状态systemctl status containerd

修改  vim /etc/containerd/config.toml注销或者[]为空

#disabled_plugins = ["cri"]

重启containerd
systemctl restart containerd

4.5部署k8s-Master

获取默认的初始化参数文件,保留备用
kubeadm config print init-defaults > init.default.yaml

列出所有镜像列表
kubeadm config images list --kubernetes-version=v1.27.6

[root@k8s-master1 jack]# kubeadm config images list --kubernetes-version=v1.27.6
registry.k8s.io/kube-apiserver:v1.27.6
registry.k8s.io/kube-controller-manager:v1.27.6
registry.k8s.io/kube-scheduler:v1.27.6
registry.k8s.io/kube-proxy:v1.27.6
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1

指定
kubeadm config images pull --cri-socket unix:///var/run/cri-dockerd.sock
可制作镜像上传脚本,方便node使用

vim image_download.sh
#!/bin/bash

images_list='                   #images list中的镜像粘贴过来
registry.k8s.io/kube-apiserver:v1.27.6
registry.k8s.io/kube-controller-manager:v1.27.6
registry.k8s.io/kube-scheduler:v1.27.6
registry.k8s.io/kube-proxy:v1.27.6
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1'

for i in ${images_list}
do
   docker pull $i
done
docker save -o k8s-1-27-0.tar ${images_list}

#其他节点导入
docker load -i k8s-1-27-0.tar


Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_06

kubeadm init \
 --apiserver-advertise-address=192.168.0.56 \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.27.6 \
 --service-cidr=100.96.0.0/12 \
 --pod-network-cidr=100.244.0.0/16 \
 --cri-socket=unix:///var/run/cri-dockerd.sock \
 --ignore-preflight-errors=all

#解释
--apiserver-advertise-address 
集群通信地址
--image-repository 
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version 
K8s版本,与上面安装的一致
--service-cidr 
集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr 
Pod网络,与下面部署的CNI网络组件yaml中保持一致
--cri-socket 
指定cri-dockerd接口,如果是containerd则使用--cri-socket unix:///run/containerd/containerd.sock
--ignore-preflight-errors=all
忽略检查的错误

如出现初始化错误,需要重置,然后重新初始化

kubeadm reset

Kubernetes第二课:kubeadm部署K8s v1.27.6_Kubernetes_07

初始化过程

步骤kubeadm init  初始化工作

1[preflight] 环境检查和拉取镜像

2[certs]配置证书 k8s和etcd证书  存放在 /etc/kubernetes/pki

3[kubeconfig]生成认证文件

4[kubelet-start]生成并启动kubelet

5[control-plane]部署管理节点,用镜像启动容器

6[etcd]部署k8s数据库,使用镜像启动容器

7[upload-config][upload-certs]上传配置文件、证书

8[mark-control-plane]给管理节点添加一个标签

8[bootstrap-token]生成自动为kubelet颁发证书

9[addone]部署组件,coreDNS、kube-proxy

k8s控制面板安装已经完成

Kubernetes第二课:kubeadm部署K8s v1.27.6_kubeadm_08

还需要做以下配置

1将连接集群的配置文件拷贝到默认路径下,才能使用命令行管理工具去管理集群,复制下列代码粘贴即可

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

完成后即可使用kubectl 命令 进行管理集群

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_09

2还需要配置网络组件,参考下列文档

 https://kubernetes.io/docs/concepts/cluster-administration/addons/

3还有其他集群需要加入的话执行下面命令即可,记得保存至文本

kubeadm join 192.168.0.56:6443 --token mzc3yu.4i9ybijq8g0eodrx \
        --discovery-token-ca-cert-hash sha256:7742d9d42ea84bdb27a3587bd3651d92a5b4d2a49eb64a57b5d0fd4beb2ca99f

如果token失效 ,用下面命令重新生成

kubeadm token create --print-join-command

修改kube-proxy 代理模式

查看kube-system
kubectl get cm -n kube-system

NAME                                                   DATA   AGE
calico-config                                          4      54m
coredns                                                1      126m
extension-apiserver-authentication                     6      126m
kube-apiserver-legacy-service-account-token-tracking   1      126m
kube-proxy                                             2      126m
kube-root-ca.crt                                       1      126m
kubeadm-config                                         1      126m
kubelet-config                                         1      126m

kubectl edit cm kube-proxy -n kube-system
37     ipvs:
     38       excludeCIDRs: null
     39       minSyncPeriod: 0s
     40       scheduler: ""
     41       strictARP: true      #改为 true
     42       syncPeriod: 0s
     43       tcpFinTimeout: 0s
     44       tcpTimeout: 0s
     45       udpTimeout: 0s
     46     kind: KubeProxyConfiguration
     47     metricsBindAddress: ""
     48     mode: "ipvs"          #改为ipvs
     49     nodePortAddresses: null
     50     oomScoreAdj: null
     51     portRange: ""
     52     showHiddenMetricsForVersion: ""
     53     winkernel:
重启kube-proxy

kubectl rollout restart daemonset kube-proxy -n kube-system

4.6部署k8s-node

k8s-node节点需完成上面4.3.2-4.3.4的步骤

完成后执行masert节点中给出的加入集群命令即可

kubeadm join 192.168.0.56:6443 --token mzc3yu.4i9ybijq8g0eodrx \
        --discovery-token-ca-cert-hash sha256:7742d9d42ea84bdb27a3587bd3651d92a5b4d2a49eb64a57b5d0fd4beb2ca99f \
        --cri-socket unix:///var/run/cri-dockerd.sock

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_10

完成node节点加入集群

Kubernetes第二课:kubeadm部署K8s v1.27.6_k8s部署_11

4.7部署容器网络插件

node节点加入集群后会发现未正常工作,此时需要部署容器网络插件打通

Kubernetes第二课:kubeadm部署K8s v1.27.6_Kubernetes_12

我们推荐使用Calico部署k8s网络组件

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubermetes、OpenStack等

Calico 在每一个计算节点利用 Linux Kerne!实现了一个高效的虚拟路由器(vRouter)来负责数据转发,而每个yRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能,

Kubernetes第二课:kubeadm部署K8s v1.27.6_kubctl_13

找到Calico 

Kubernetes第二课:kubeadm部署K8s v1.27.6_Kubernetes_14

https://docs.tigera.io/calico/latest/getting-started/kubernetes/

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_15

Kubernetes第二课:kubeadm部署K8s v1.27.6_Kubernetes_16

执行以下命令部署

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml

还需要修改pod网络IP,先下载custom-resources.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
修改
vim custom-resources.yaml

      cidr: 100.244.0.0/16
      
创建
 kubectl create -f custom-resources.yaml


Kubernetes第二课:kubeadm部署K8s v1.27.6_kubeadm_17

等待网络创建完成,网络原因比较慢或不通

Kubernetes第二课:kubeadm部署K8s v1.27.6_k8s部署_18

4.8验证节点可用性

查看节点状态
kubectlget cs

查看pod运行状态
kubectl get podns -n kub-system

查看calico-system名空间中的pod运行情况
kubectl get pods -n calico-system

验证DNS 是否正常

安装dig 工具
 yum -y install bind-utils
[root@k8s-master1 jack]# dig -t a www.baidu.com@100.96.0.10

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.15 <<>> -t a www.baidu.com@100.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 21453
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com\@100.96.0.10.    IN      A

;; AUTHORITY SECTION:
.                       60312   IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2024020601 1800 900 604800 86400

;; Query time: 144 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Wed Feb 07 13:44:12 CST 2024
;; MSG SIZE  rcvd: 129


5.部署Dashboard(UI管理界面)

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

编辑recommended.yaml 下方位置添加 type: NodePort ,注意:跟一个空格

端口映射需要

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_19

kubectl apply -f recommended.yaml

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_20

检查容器是否正常运行

kubectl get pods,svc -n kubernetes-dashboard

下图状态可知,dashboard内部端口为443,对外暴露端口为32275,因此,我们使用浏览器访问32275端口进行测试

Kubernetes第二课:kubeadm部署K8s v1.27.6_kubctl_21

Kubernetes第二课:kubeadm部署K8s v1.27.6_Kubernetes_22

使用token进行登录

创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret  awk '/dashboard-admin/(print $1)')

复制token到浏览器进行登录

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_23

Kubernetes第二课:kubeadm部署K8s v1.27.6_docker_24

至此完成K8s集群的部署