2024-07-02
k8s
00
请注意,本文编写于 169 天前,最后修改于 131 天前,其中某些信息可能已经过时。

目录

Kubernete集群部署
1.kubernetes集群部署方式
(1).yum安装
(2).kind
(3).minikube
(4).kubeadm
(5).二进制安装
(6).源码编译安装
kubeadm部署Kubernetes集群
系统初始化准备
时间同步
临时关闭交换分区
基于配置文件关闭
确保各个节点MAC地址或product_uuid唯一
检查网络节点是否互通
允许iptable检查桥接流量
配置ipvs功能
禁防火墙
禁用selinux
配置host解析
部署容器运行时(1.24之前的版本默认使用docker)
两种方式,yum和二进制 第一种不是最新版,也能跑
yum安装
查看YUM源中Containerd软件
使用yum命令安装
验证安装及启动服务
设置containerd服务启动及开机自启及状态
二进制安装
修改containerd配置文件
所有节点安装kubeadm,kubelet,kubectl
配置软件源
安装 kubelet、kubeadm 和 kubectl,并启用 kubelet 以确保它在启动时自动启动
查看kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!)
启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!)
温馨提示:(可以将k8s软件打包到其他节点安装哟,前提是得开启rpm包缓存。)
初始化master节点
拷贝文件用于管理集群
查看集群节点
添加自动补全功能

Kubernete集群部署

1.kubernetes集群部署方式

(1).yum安装

优点: 安装,配置很简单,适合新手学习。 缺点: 不能定制安装。

(2).kind

kind安装: kind让你能够在本地计算机上运行Kubernetes。 kind要求你安装并配置好Docker。 推荐阅读:

(3).minikube

minikube是一个工具, 能让你在本地运行Kubernetes。 minikube在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的Kubernetes集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。因此很适合开发人员体验K8S。 推荐阅读:

(4).kubeadm

你可以使用kubeadm工具来创建和管理Kubernetes集群,适合在生产环境部署。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。 推荐阅读: 推荐阅读 推荐阅读

(5).二进制安装

安装步骤比较繁琐,但可以更加了解细节。适合运维人员生产环境中使用。

(6).源码编译安装

难度最大,请做好各种故障排查的心理准备。其实这样一点对于K8S二次开发的人员应该不是很难。 2.kubectl时kubernetes集群的命令行工具 kubectl使得你可以对Kubernetes集群运行命令。 你可以使用kubectl来部署应用、监测和管理集群资源以及查看日志。 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

大规模注意事项

image.png

https://kubernetes.io/zh-cn/docs/setup/best-practices/cluster-large/

kubeadm部署Kubernetes集群

注意

所有机器上都要做的操作

系统初始化准备

时间同步

yum install -y ntp service ntpd start

临时关闭交换分区

swapoff -a && sysctl -w vm.swappiness=0 #临时禁用交换分区

基于配置文件关闭

sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab #永久禁用交换分区 cat /etc/fstab

确保各个节点MAC地址或product_uuid唯一

ifconfig eth0 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid

检查网络节点是否互通

简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。

允许iptable检查桥接流量

#| tee #往文件里面追加内容

cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat > /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system # 生效 modprobe br_netfilter #加载网桥过滤器模块 lsmod | grep br_netfilter # 验证是否生效

配置ipvs功能

在kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs,两者对比ipvs的性能要高,如果想要使用ipvs模型,需要手动载入ipvs模块

yum -y install ipvsadm ipset #没有加载成功则手动执行 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 755 /etc/sysconfig/modules/ipvs.modules source /etc/sysconfig/modules/ipvs.modules systemctl enable --now systemd-modules-load.service # 验证ipvs模块 lsmod | grep -e ip_vs -e nf_conntrack_ipv4

禁防火墙

systemctl disable --now firewalld echo 1 >/proc/sys/net/ipv4/ip_forward #proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1

禁用selinux

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config grep ^SELINUX= /etc/selinux/config

配置host解析

根据自己环境改

cat >> /etc/hosts <<'EOF' 10.0.0.151 k8s151.com 10.0.0.152 k8s152.com 10.0.0.153 k8s153.com 10.0.0.154 k8s154.com EOF cat /etc/hosts # 验证结果

部署容器运行时(1.24之前的版本默认使用docker)

部署Containerd(推荐工作用)

相关信息

k8s使用containerd 1、需要containerd 2、需要runc环境 3、需要cni网络接口 注:containerd默认不会自带runc(真正创建容器的程序),所以需要安装runc程序,以及cni网络插件(容器之间网络通信所需)。

两种方式,yum和二进制 第一种不是最新版,也能跑
yum安装
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看YUM源中Containerd软件
yum list | grep containerd
使用yum命令安装
yum -y install containerd.io
验证安装及启动服务
rpm -qa | grep containerd
设置containerd服务启动及开机自启及状态
runc -v systemctl enable --now containerd systemctl restart containerd

二进制安装

官方 https://containerd.io/

官方下载地址 https://github.com/containerd/containerd/releases

#------containerd------ wget https://github.com/containerd/containerd/releases/download/v1.7.18/cri-containerd-cni-1.7.18-linux-amd64.tar.gz tar xf cri-containerd-cni-1.7.18-linux-amd64.tar.gz -C / #----libseccomp准备----- wget https://github.com/opencontainers/runc/releases/download/v1.1.13/libseccomp-2.5.5.tar.gz tar xf libseccomp-2.5.5.tar.gz cd libseccomp-2.5.5/ yum install gperf -y ./configure make && make install #------runc准备----- wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64 chmod +x runc.amd64 #替换containerd安装已安装的runc mv runc.amd64 /usr/local/sbin/runc #执行runc命令 runc -v

输出结果

[root@master01 ~]$ runc -v runc version 1.1.13 commit: v1.1.13-0-g58aa9203-dirty spec: 1.0.2-dev go: go1.21.11 libseccomp: 2.5.5 [root@master01 ~]$
修改containerd配置文件
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml #修改配置文件,主要修改以下配置: vim /etc/containerd/config.toml .... 61 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" #修改沙箱镜像pause为国内镜像 125 SystemdCgroup = true #设置驱动为system # 设置拉去镜像地址为aliyun镜像地址 # registry.cn-hangzhou.aliyuncs.com sed -i '/\[plugins\."io\.containerd\.grpc\.v1\.cri"\.registry\.mirrors\]/a\ [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\n endpoint = ["https://8aj710su.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]' /etc/containerd/config.toml systemctl daemon-reload systemctl restart containerd

所有节点安装kubeadm,kubelet,kubectl

配置软件源

# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch/ 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

安装 kubelet、kubeadm 和 kubectl,并启用 kubelet 以确保它在启动时自动启动

这个时候应该会报错,不报错更好,yum问题,直接去看解决方案 http://115.29.205.107/post/19

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

查看kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!)

yum -y list kubeadm --showduplicates | sort -r [root@master01 ~]$ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"} [root@master01 ~]$ kubelet --version Kubernetes v1.28.2 [root@master01 ~]$

启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!)

systemctl enable --now kubelet && systemctl status kubelet

温馨提示:(可以将k8s软件打包到其他节点安装哟,前提是得开启rpm包缓存。)

mkdir k8s-rpm && find /var/cache/yum -name "*.rpm" | xargs mv -t k8s-rpm

初始化master节点

只需要在主节点操作

-------使用containerd的容器运行时------ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.27.0 --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=10.0.0.151 --cri-socket unix:///var/run/containerd/containerd.sock 相关参数说明: --apiserver-advertise-address: 指定apiserver的地址,用于其他节点连接用的内网地址。 --kubernetes-version: 指定K8S master组件的版本号。 --image-repository: 指定下载k8s master组件的镜像仓库地址。 --pod-network-cidr: 指定Pod的网段地址。 --service-cidr: 指定SVC的网段 使用kubeadm初始化集群时,可能会出现如下的输出信息: [init] 使用初始化的K8S版本。 [preflight] 主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。 [certs] 生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。 [kubeconfig] 生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。 [kubelet-start] 启动kubelet, 环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env" 配置文件默认写入:"/var/lib/kubelet/config.yaml" [control-plane] 使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。 此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler" [etcd] 创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests" [wait-control-plane] 等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。 [apiclient] 等待所有的master组件正常运行。 [upload-config] 创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。 [kubelet] 创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置 [upload-certs] 跳过此节点,详情请参考”--upload-certs" [mark-control-plane] 标记控制面板,包括打标签和污点,目的是为了标记master节点。 [bootstrap-token] 创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。 如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。 [kubelet-finalize] 更新kubelet的证书文件信息 [addons] 添加附加组件,例如:"CoreDNS"和"kube-proxy”

拷贝文件用于管理集群

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config #去除master的污点,不然不会被调度(一般master只是作为管理者,去除污点后就可以了) kubectl taint nodes --all node-role.kubernetes.io/control-plane-

查看集群节点

[root@k8s151 ~]$ kubectl get no NAME STATUS ROLES AGE VERSION k8s151 NotReady master 4m34s v1.15.12 [root@k8s151 ~]$ kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} [root@k8s151 ~]$ kubectl get no,cs NAME STATUS ROLES AGE VERSION node/k8s151 NotReady master 5m47s v1.15.12 NAME STATUS MESSAGE ERROR componentstatus/scheduler Healthy ok componentstatus/controller-manager Healthy ok componentstatus/etcd-0 Healthy {"health":"true"}

image.png

在152和153上执行 kubeadm join 10.0.0.151:6443 --token a3fndb.oitexxftm0xpx90j \ --discovery-token-ca-cert-hash sha256:ef830cffbeb332ae329af30a9257fd7584e034d524bc5cb2cd6e9bcfe6307f10 节点都加入之后,查看一下 [root@k8s151 ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s151.oldboyedu.com NotReady master 10m v1.18.0 k8s152.oldboyedu.com NotReady <none> 60s v1.18.0 k8s153.oldboyedu.com NotReady <none> 38s v1.18.0

添加自动补全功能

所有组件都 echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc # 安装bash-completion ## bash-completion-extras需要epelrepo源 yum install -y bash-completion bash-completion-extras # 配置自动补全 source /usr/share/bash-completion/bash_completion echo 'source <(kubectl completion bash)' >>~/.bashrc 如果 kubectl 有关联的别名,你可以扩展 shell 补全来适配此别名: echo 'alias k=kubectl' >>~/.bashrc echo 'complete -F __start_kubectl k' >>~/.bashrc 系统全局 kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null source ~/.bashrc
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay