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.服务器硬件配置推荐
配置大小决定能跑多少个容器
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
升级系统内核
建议使用红框中给出的内核版本
检查系统内核版本
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
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 容器运行时接口
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才会生效
查看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
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
初始化过程
步骤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控制面板安装已经完成
还需要做以下配置
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 命令 进行管理集群
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
完成node节点加入集群
4.7部署容器网络插件
node节点加入集群后会发现未正常工作,此时需要部署容器网络插件打通
我们推荐使用Calico部署k8s网络组件
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubermetes、OpenStack等
Calico 在每一个计算节点利用 Linux Kerne!实现了一个高效的虚拟路由器(vRouter)来负责数据转发,而每个yRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能,
找到Calico
https://docs.tigera.io/calico/latest/getting-started/kubernetes/
执行以下命令部署
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
等待网络创建完成,网络原因比较慢或不通
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 ,注意:跟一个空格
端口映射需要
kubectl apply -f recommended.yaml
检查容器是否正常运行
kubectl get pods,svc -n kubernetes-dashboard
下图状态可知,dashboard内部端口为443,对外暴露端口为32275,因此,我们使用浏览器访问32275端口进行测试
使用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到浏览器进行登录
至此完成K8s集群的部署