目前生产部署Kubernetes 集群主要有三种方式:kubeadm、二进制、MiniKube
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群,将每个组件都运行为pod部署。
1、基础环境
系统:Linux、centos 7.9 、3 台可以联网
k8s 版本:1.23.1
docker 版本:20.10.16
2、添加域名映射
修改主机名 HostName
# 192.168.244.100
hostnamectl set-hostname master
# 192.168.244.101
hostnamectl set-hostname node1
# 192.168.244.102
hostnamectl set-hostname node2
在每个节点上添加 hosts 信息:
cat <<EOF >> /etc/hosts
192.168.244.100 master
192.168.244.101 node1
192.168.244.102 node2
EOF
测试各节点之间能否 ping 通
ping master
ping node1
ping node2
3、禁用SELINUX、防火墙,每台服务器都需要禁用
禁用SELINUX
将 SELINUX=enforcing 改为 SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
禁用防火墙
systemctl stop firewalld && systemctl disable firewalld
4、关闭 swap 分区,每台服务器都需要关闭
临时关闭
swapoff -a
永久关闭
vim /etc/fstab
#注释下面这行,或使用 sed 命令注释 sed -ri 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
验证是否关闭成功
# 若swap都显示 0 则表示关闭成功,需要重启服务器生效,可以使用 reboot 或 shutdown -r now 命令重启
[root@node2 ~]# free -m
total used free shared buff/cache available
Mem: 3770 305 3115 11 350 3242
Swap: 0 0 0
5、同步网络时间,三台服务器都执行 ntpdate ntp1.aliyun.com,通过网络同步时间
# 如果没有 ntpdate ,使用如下命令安装: yum install -y ntpdate
ntpdate ntp1.aliyun.com # 使用
date # 查看时间
6、添加 yum 源,三台服务器都添加
添加 k8s 的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
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
添加 docker 的 yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果报错 -bash: yum-config-manager: command not found 则运行 yum install -y yum-utils
如果安装 yum-utils 报错 failure: repodata/repomd.xml from kubernetes: [Errno 256] No more mirrors to try.,则设置 repo_gpgcheck=0
7、安装 k8s 组件,每台服务器都需要执行
yum -y install kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 docker-ce
# Kubectl:Kubectl 管理 Kubernetes 集群命令行工具
# kubeadm:Kubeadm 是一个快捷搭建kubernetes(k8s)的安装工具,它提供了kubeadm init 以及 kubeadm join这两个命令来快速创建kubernetes集群
# kubelet:kubelet 是在每个 Node 节点上运行的主要 “节点代理”。
docker 报错 : Problem 1: problem with installed package podman-2.0.5-5.module_el8.3.0+512+b3b58dca.aarch64
原因是 centos 8.0 以上版本 docker 和 podman 冲突,使用 yum erase -y podman buildah 移除 podman 即可
kubelet 报错:Error: Problem: cannot install the best candidate for the job - package kubelet does not have a compatible architecture
选的 centos 7.9 安装成功,centos 8.2 安装失败,不建议选过高版本
报错:[Errno -1] repomd.xml signature could not be verified for kubernetes Trying other mirror.
解决方法:https://github.com/kubernetes/kubernetes/issues/60134
8、启动服务,每台服务器都需要执行
systemctl enable kubelet && systemctl start kubelet # 开机自启动并启动 kubelet 服务
systemctl enable docker && systemctl start docker # 开机自启动并启动 docker 服务
修改 docker 配置
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://m24eqnhh.mirror.aliyuncs.com"]
}
EOF
重启docker,可使用 docker info 查看是否修改成功
systemctl daemon-reload && systemctl restart docker
9、kubeadm init 初始化集群,该命令只需要在主节点master执行。注意: 失败了要使用用 kubeadm reset 重置
# 初始化集群控制台 Control plane
# apiserver-advertise-address: master 节点 IP
# image-repository:镜像仓库地址
# kubernetes-version: 版本号
# pod-network-cidr 和 service-cidr 不清楚如何设置,使用该默认值
# 查看其他默认值可使用命令: kubeadm config print init-defaults > kubeadm.yaml 查看默认初始化文件
kubeadm init \
--apiserver-advertise-address=192.168.244.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16
kubeadm init 遇到的错误解决方法:
systemctl status kubelet 查看 kubelet 有没有启动(初始化失败会启动失败,初始化成功会自动重启)
kubectl get pods -n kube-system (查看系统 pod 运行状态)
kubectl describe pod [pod-name] -n kube-system(查看系统 pod 启动详情)
journalctl -xefu kubelet (查看 kubelet 启动日志)
如果init失败,使用如下命令进行回退
[root@master ~]# kubeadm reset -f
[root@master ~]# rm -rf /etc/kubernetes
[root@master ~]# rm -rf /var/lib/etcd/
[root@master ~]# rm -rf $HOME/.kube
10、node 工作节点加入集群
初始化成功可以看到提示信息,配置成功可以使用 kubectl 控制集群。复制主节点授权文件到其他节点,以便 kubectl 的 node 节点也有权限访问集群
初始化成功,记得把 kubeadm join xxx 保存起来,忘记了重新获取:
kubeadm token create --print-join-command 默认 24h 过期
kubeadm token create --print-join-command --ttl=0 永不过期
kubeadm token list 查看是否有存活的 token
kubectl 的 master 节点初始化成功会生成 /etc/kubernetes/admin.conf 认证文件
添加环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
node 节点添加认证,如果不添加会报错:The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 将 master 节点 config 文件通过 scp 命令传递到 node 子节点
mkdir -p $HOME/.kube # node 节点执行
scp /etc/kubernetes/admin.conf root@node1:/root/.kube/config # master 节点执行,分别复制到每个node
chown $(id -u):$(id -g) $HOME/.kube/config # node 节点执行,每个node都执行
在每个node节点执行以下命令,加入集群
kubeadm join 192.168.25.100:6443 --token b0t2j0.te29am3punpg93ir --discovery-token-ca-cert-hash sha256:90fbef8b3f2d63cb35127fdbc1214870bb9251858928c7647ce9d874a71d421b
如果 node 节点加入集群报错,使用 journalctl -xefu kubelet 查看日志,再执行kubeadm join 命令前使用 kubeadm reset 重置
解决kubeadm init /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
11、安装网络插件 Flannel
节点加入集群成功,使用 kubectl get nodes 查看节点信息,发现都是 NotReady,需要在主节点安装网络插件 Flannel 或 Calicos
Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络包里面进行路由转发和通信。
Flannel 配合 etcd 可以实现不同宿主机上的 docker 容器内网IP的互通。
主节点安装网络插件,安装可能需要几分钟
# 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 也可以使用如下方式安装 flannel 组件,先下载 yaml 文件
wget -c https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
# 如果出现无法访问的情况,可以直接用下面的
[root@master ~]# wget https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
# 修改文件中quay.io仓库为quay-mirror.qiniu.com
# 使用配置文件启动fannel
[root@master ~]# kubectl apply -f kube-flannel.yml
# 如果要卸载 flannel 可以使用如下方式,根据你安装时的方式选择
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl delete -f kube-flannel.yml
# 如果要安装 calico,使用如下方式
# kubectl apply -f https://projectcalico.docs.tigera.io/manifests/calico.yaml
kubectl get pods -n kube-system 查看 容器运行状态
安装完成等几分钟所有节点状态从 NotReady 变为 Ready,查看所有系统的 pod,保证每个都是运行状态,如果还有失败的,排查错误
记录节点NotReady排查过程
kubectl get node查看集群节点是否处于Ready状态
如果是Ready状态,再使用kubectl describe node <nodeName> 查看资源使用率
如果是NotReady,则使用kubectl get node -o wide查看对应的节点,然后登陆到对应节点上查看kubelet 和docker服务是否正常
kubectl get cs 查看集群关键组件的状态是否是Healthy
如果是,不予理睬
如果是Unhealthy状态,则使用kubectl get node -o wide 查看对应的节点,然后登陆到对应节点上查看kubelet 和docker服务是否正常
kubectl -n <namespace> get pod -o wide <-W> 查看pod 是否处于running状态
kubectl -n <namespace> describe pod <podName> 查看非running状态到具体可能原因
kubectl-n <namespace> logs -f <podName> [-c <containerName>] 查看日志
#连接到node节点,并检查各节点服务是否正常
$ ps aux|grep kube-proxy
$ ps aux|grep kubelet
$ ps aux|grep docker
$ ps aux|grep flanneld
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
在单机上模拟出一个k8s集群
Dashboard 是一个基于 Web 的 Kubernetes 用户界面。您可以使用 Dashboard 将容器化应用程序部署到 Kubernetes 集群、对容器化应用程序进行故障排除以及管理集群资源。您可以使用 Dashboard 了解集群上运行的应用程序的概览,以及创建或修改单个 Kubernetes 资源(例如 Deployment、Jobs、DaemonSet 等)。例如,您可以使用部署向导扩展部署、启动滚动更新、重新启动 pod 或部署新应用程序。
使用官网提供的 deploy/recommended.yaml 清单安装 kubernetes-dashboard, 或者使用 Helm 安装
方法一:默认安装
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
方法二:修改配置安装,下载 recommended.yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
修改recommended.yaml,新增type: NodePort。创建为NodePort类型的服务,可以通过任意节点ip进行访问
查看pod和service
[root@master ~]# kubectl apply -f recommended.yaml
[root@master ~]# kubectl get pods -n kubernetes-dashboard #查看pod的运行情况
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-799d786dbf-vgd5l 1/1 Running 0 3m28s
kubernetes-dashboard-546cbc58cd-pmtpj 1/1 Running 0 3m28s
[root@master ~]# kubectl get svc -n kubernetes-dashboard #查看service信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.96.31.248 <none> 8000/TCP 3m31s
kubernetes-dashboard NodePort 10.96.1.37 <none> 443:30787/TCP 3m31s
使用 Token 的方式登录,获取 Token 方式如下:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep kubernetes-dashboard | awk '{print $1}')
出现下述问题的原因是因为 kubernetes-dashboard 这个账户的角色权限不够
创建新用户
K8S有两种用户:User 和 Service Account。User 给人用,Service Account 给进程用,让进程有相关权限,Dashboard 是一个进程,我们就可以创建一个Service Account 给它
#创建 dashboard-adminuser.yaml
cat > dashboard-adminuser.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
[root@master dashboard]# kubectl apply -f dashboard-adminuser.yaml
serviceaccount/admin-user created
创建了一个叫 admin-user 的服务账号,并放在kubernetes-dashboard 命名空间下,并将 cluster-admin 角色绑定到admin-user账户,这样admin-user账户就有了管理员的权限。默认情况下,kubeadm创建集群时已经创建了cluster-admin角色,我们直接绑定即可。
查看admin-user账户的token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
置 token 过期时间
用 token 登陆 kubernetes-dashboard,默认的 token 认证时间是 900s/15 分钟,失效需要重新登录灰常麻烦,添加 - --token-ttl=604800 (单位 s)参数修改 token 过期时间为 7 天。 kubernetes-dashboard 平台可使用如下方法,你也可以选择修改 recommended.yaml 文件,重新 apply 即可
选择 kubernetes-dashboard 命名空间
编辑 deployment/kubernetes-dashboard 配置文件
在对应位置添加 - --token-ttl=604800 (单位 s)
点击更新即可生效
集群规划
Kubernetes有一主多从或多主多从的集群部署方式,这里我们采用一主多从的方式
1、基础环境
系统:Linux、centos 7.9 、3 台可以联网
k8s 版本:1.24.3
2、添加域名映射
修改主机名 HostName
# 192.168.25.100
hostnamectl set-hostname master
# 192.168.25.101
hostnamectl set-hostname node1
# 192.168.25.102
hostnamectl set-hostname node2
在每个节点上添加 hosts 信息:
cat <<EOF >> /etc/hosts
192.168.244.100 master
192.168.244.101 node1
192.168.244.102 node2
EOF
测试各节点之间能否 ping 通
ping master
ping node1
ping node2
3、禁用SELINUX、防火墙,每台服务器都需要禁用
禁用SELINUX
将 SELINUX=enforcing 改为 SELINUX=disabled
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
禁用防火墙
systemctl stop firewalld && systemctl disable firewalld
4、关闭 swap 分区,每台服务器都需要关闭
临时关闭
swapoff -a
永久关闭
vim /etc/fstab
#注释下面这行,或使用 sed 命令注释 sed -ri 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
验证是否关闭成功
# 若swap都显示 0 则表示关闭成功,需要重启服务器生效,可以使用 reboot 或 shutdown -r now 命令重启
[root@node2 ~]# free -m
total used free shared buff/cache available
Mem: 3770 305 3115 11 350 3242
Swap: 0 0 0
5、同步网络时间,三台服务器都执行 ntpdate ntp1.aliyun.com,通过网络同步时间
# 如果没有 ntpdate ,使用如下命令安装: yum install -y ntpdate
ntpdate ntp1.aliyun.com # 使用
date # 查看时间
6、bridged网桥设置
为了让服务器的iptables能发现bridged traffic,需要添加网桥过滤和地址转发功能。新建modules-load.d/k8s.conf文件
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
加载配置文件
sysctl --system
加载br_netfilter网桥过滤模块,和加载网络虚拟化技术模块
modprobe br_netfilter
modprobe overlay
检验网桥过滤模块是否加载成功
[root@k8s-master ~]# lsmod | grep -e br_netfilter -e overlay
br_netfilter 22256 0
bridge 151336 1 br_netfilter
overlay 91659 0
7、配置IPVS
service有基于iptables和基于ipvs两种代理模型。基于ipvs的性能要高一些。需要手动载入才能使用ipvs模块
#安装ipset和ipvsadm
yum install ipset ipvsadm
新建脚本文件/etc/sysconfig/modules/ipvs.modules,内容如下:
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_ipv4
EOF
添加执行权限给脚本文件,然后执行脚本文件
chmod +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
检验模块是否加载成功
[root@k8s-master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4 15053 2
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 139264 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
安装Containerd
containerd的项目官方地址: https://github.com/containerd/containerd
containerd的发布版本地址: https://github.com/containerd/containerd/releases
containerd和kubernetes版本对应关系,参考:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md
https://github.com/kubernetes/kubernetes/blob/master/build/dependencies.yaml
Containerd有两种安装包:
containerd-xxx:这种包用于单机测试没问题,不包含runC,需要提前安装。
cri-containerd-cni-xxxx:包含runc和k8s里的所需要的相关文件。k8s集群里需要用到此包。虽然包含runC,但是依赖系统中的seccomp(安全计算模式,是一种限制容器调用系统资源的模式。)
到containerd的github release页面下载containerd安装包,这里我们安装的是containerd-1.6.6版本
wget https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-amd64.tar.gz
将下载的containerd解压至/usr/local目录下并验证
tar -zxf containerd-1.6.6-linux-amd64.tar.gz -C /usr/local
#解压完成后,执行ctr -v 便可查看版本
[root@master ~]# ctr -v
ctr github.com/containerd/containerd v1.6.6
创建containerd.service并设置为开机启动,这样我们就可以通过 systemd 来配置 containerd 作为守护进程运行了
vim /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
# 这里需要修改为containerd的安装路径
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
[root@master ~]# sudo systemctl daemon-reload
[root@master ~]# sudo systemctl enable containerd --now
配置containerd镜像源
由于网络原因,我们无法直接访问k8s.gcr.io网站。因此我们修改containerd的配置文件config.toml配置一下containerd的镜像源
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
修改config.toml文件
vim /etc/containerd/config.toml
在 plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options 配置块下面将 SystemdCgroup 设置为 true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
....
配置镜像仓库加速器,需要在 cri 配置块下面的 registry 配置块下面进行配置registry.mirrors:
[plugins."io.containerd.grpc.v1.cri"]
...
# sandbox_image = "k8s.gcr.io/pause:3.6" 避免无法从国外镜像仓库拉取镜像
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
...
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/k8sxio"]
重启containerd服务,并查看服务启动状态
systemctl restart containerd
systemctl status containerd
执行ctr -v 或者ctr version便可查看版本
[root@master ~]# ctr -v
ctr github.com/containerd/containerd v1.6.6
[root@master ~]# ctr version
Client:
Version: v1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
Go version: go1.17.11
Server:
Version: v1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
UUID: 95844c2c-4d9b-4493-a245-55541967a55d
安装crictl
crictl是Kubernetes用于管理Containerd上的镜像和容器的一个命令行工具
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.24.0/crictl-v1.24.0-linux-amd64.tar.gz
# 如果有限制,也可以替换成下面的 URL 加速下载
# wget https://download.fastgit.org/kubernetes-sigs/cri-tools/releases/download/v1.24.0/crictl-v1.24.0-linux-amd64.tar.gz
tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz
创建crictl的配置文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
pull-image-on-create: false
EOF
[root@master ~]# systemctl daemon-reload
[root@master ~]# crictl -v
crictl version v1.24.0
安装runc
runC它是用来运行容器的一个轻量级工具。被称为运行容器的运行时,它负责利用符合标准的文件OCI(Open Container Initiative)标准等资源运行容器
wget https://github.91chi.fun//https://github.com//opencontainers/runc/releases/download/v1.0.3/runc.amd64
chmod +x runc.amd64
mv runc.amd64 /usr/local/bin/runc
runc -v
使用kubeadm安装k8s集群
kubeadm是一个Kubernetes的部署工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤,可用于实现集群的部署、升级、降级及拆除。
1、添加k8s的阿里云yum源
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=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
2、yum安装kubeadm kubelet kubectl,此次我们安装的是1.24.3版本
yum -y install kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3
启动kubelet
systemctl enable kubelet
可以查看集群所需镜像的版本
kubeadm config images list
方法一:通过kubeadm init命令初始化master主节点(只在master节点执行)
kubeadm init \
--apiserver-advertise-address=192.168.244.101 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.24.3 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16
#–apiserver-advertise-address:API Server监听的IP地址,这里就是master节点的IP
#–pod-network-cidr:指定pod网络的IP地址范围。直接填写这个就可以了
#–service-cidr:service VIP的IP地址范围。默认就10.96.0.0/12。直接填写这个就可以了
方法二:
[root@master ~]# kubeadm config print init-defaults > init.yaml
[root@master ~]# ll /var/run/containerd/containerd.sock
srw-rw---- 1 root root 0 10月 17 13:32 /var/run/containerd/containerd.sock
[root@master ~]# vim init.yaml
localAPIEndpoint:
advertiseAddress: 192.168.244.101
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
···省略···
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.24.3
[root@master ~]# kubeadm init --config=init.yaml
如果init失败,使用如下命令进行回退
[root@master ~]# kubeadm reset -f
[root@master ~]# rm -rf /etc/kubernetes
[root@master ~]# rm -rf /var/lib/etcd/
[root@master ~]# rm -rf $HOME/.kube
设置.kube/config(只在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
在每个node节点执行以下命令,加入集群
kubeadm join 192.168.244.101:6443 --token b0t2j0.te29am3punpg93ir --discovery-token-ca-cert-hash sha256:90fbef8b3f2d63cb35127fdbc1214870bb9251858928c7647ce9d874a71d421b
回到master节点,输入kubectl get nodes命令,此时我们可以看到有三个节点,但是节点的状态都是NotReady,这是因为集群的网络还没有配好。
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 56m v1.24.3
node1 NotReady <none> 38m v1.24.3
node2 NotReady <none> 38m v1.24.3
安装网络插件calico(只在master执行)
calico官网:https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
下载calico.yaml文件,插件使用的是DaemonSet的控制器,会在每个节点都运行
curl https://docs.projectcalico.org/archive/v3.19/manifests/calico.yaml -O
安装并修改其网段,该网段内容是kubeadm init 指定的 pod-network-cidr 地址
[root@master ~]# vim calico.yaml
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
查看需要的镜像
cat calico.yaml | grep image
部署calico
kubectl apply -f calico.yaml
查看集群中的pods
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-57d95cb479-wb2cx 1/1 Running 0 33m
kube-system calico-node-dbg4k 1/1 Running 0 33m
kube-system calico-node-g75d2 1/1 Running 0 33m
kube-system calico-node-p74l5 1/1 Running 0 33m
kube-system coredns-74586cf9b6-7zsf8 1/1 Running 0 100m
kube-system coredns-74586cf9b6-wvqnm 1/1 Running 0 100m
kube-system etcd-master 1/1 Running 0 100m
kube-system kube-apiserver-master 1/1 Running 0 100m
kube-system kube-controller-manager-master 1/1 Running 0 100m
kube-system kube-proxy-hj4n2 1/1 Running 0 82m
kube-system kube-proxy-wf6vh 1/1 Running 0 82m
kube-system kube-proxy-xrpdq 1/1 Running 0 100m
kube-system kube-scheduler-master 1/1 Running 0 100m
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane 100m v1.24.3
node1 Ready <none> 82m v1.24.3
node2 Ready <none> 82m v1.24.3
kubectl 的 Bash 补全脚本可以用命令 kubectl completion bash 生成。 在 Shell 中导入(Sourcing)补全脚本,将启用 kubectl 自动补全功能。然而,补全脚本依赖于工具 bash-completion
yum install bash-completion #安装 bash-completion
source /usr/share/bash-completion/bash_completion
#当前用户生效
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
#系统全局
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null