Kubernetes (k8s) 搭建过程
1、安装要求 安装三台虚拟机,硬件规划配置大致如下:
上面的服务器配置可以搭建一套单master集群
Operating System: CentOS Linux 7 (Core) Kernel: Linux 3.10.0-862.el7.x86_64 Architecture: x86-64
CentOS Linux release 7.9.2009 (Core)
2、配置免密登录 三台服务器之间配置互信免密登录 ssh-keygen -t rsa
使用 ssh-copy-id 复制公钥到所有服务器 ssh-copy-id k8snode1 、ssh-copy-id k8snode2 、ssh-copy-id k8snode3 for host in ${HOSTS[@]};do sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $host; ssh $host "hostnamectl set-hostname $host"; done
更换yum国内源,推荐配阿里源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
--2023-05-26 19:45:15-- http://mirrors.aliyun.com/repo/Centos-7.repo Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 140.207.236.230, 140.207.236.146, 140.207.236.232, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|140.207.236.230|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 2523 (2.5K) [application/octet-stream] Saving to: ‘/etc/yum.repos.d/CentOS-Base.repo’ 100%[========================================================>] 2,523 --.-K/s in 0.002s 2023-05-26 19:45:15 (344 MB/s) - ‘/etc/yum.repos.d/CentOS-Base.repo’ saved [2523/2523]
网易源:
wget -O /etc/yum.repos.d/CentOS-Base163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
--2023-05-26 19:46:47-- http://mirrors.163.com/.help/CentOS7-Base-163.repo Resolving mirrors.163.com (mirrors.163.com)... 101.71.33.11 Connecting to mirrors.163.com (mirrors.163.com)|101.71.33.11|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1572 (1.5K) [application/octet-stream] Saving to: ‘/etc/yum.repos.d/CentOS-Base163.repo’ 100%[==========================================================>] 1,572 --.-K/s in 0.002s 2023-05-26 19:46:47 (794 KB/s) - ‘/etc/yum.repos.d/CentOS-Base163.repo’ saved [1572/1572]
清理yum缓存,并生成新的缓存。 yum clean all yum makecache
更新yum源检查是否生效 yum update yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
若更新 yum 源不更新内核:直接在 yum 的命令后面加如下的参数。 yum --exclude=kernel* update
更新后的内核版本如下 Kernel: Linux 3.10.0-1160.90.1.el7.x86_64 Architecture: x86-64
配置虚拟机IP Vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="dhcp" # "static" 这修改成静态 NAME="ens33" UUID="c43b3a64-0737-496d-b291-0006ad1db97a" DEVICE="ens33" ONBOOT="yes"
修改如下: ONBOOT="yes" IPADDR=192.168.59.133 NETMASK=255.255.255.0 GATEWAY=192.168.59.2
重新启动网卡 systemctl restart NetworkManager #systemctl stop NetworkManager systemctl restart network service network restart #systemctl disable NetworkManager
查看Gateway 执行如下指令: route -n|grep '^0.0.0.0' | awk '{print $2}'
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.59.2 0.0.0.0 UG 100 0 0 ens33 192.168.59.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
ping 14.215.177.39 ping www.baidu.com
nameserver 223.5.5.5 nameserver 119.29.29.29 nameserver 114.114.114.114
2、kubeadm 部署方式介绍 Kubeadm 是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署: 第一、创建一个Master节点 kubeadm init 第二、将Node节点加入到当前集群中 kubeadm join <Master 节点的 IP 和端口>
3、安装要求 在开始之前,部署 kubernetes 集群机器需要满足以下几个条件: ✬一台或多台机器,操作系统 CentOS7.x-86_x64。 ✬硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多。 ✬可以访问互联网,需要拉取镜像,安装软件。 ✬禁止 swap 分区。
4、最终目标 1、在所有节点是安装 Docker 和 kubeadm 2、部署 kubernetes Master 3、部署容器网络插件 4、部署 kubernetes Node 将节点加入 kubernetes 集群中 5、部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
5、准备环境
6、系统初始化操作 6.1 关闭防火墙 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld
6.2 关闭selinux: sed -i 's/enforcing/disabled/' /etc/selinux/config #永久 setenforce 0 #临时 查看selinux状态 sestatus #查看是否生效 getenforce #查看是否生效
6.3 关闭swap: sed -i 's/.swap./#&/' /etc/fstab #注释掉swap这一行,永久关闭。 swapoff -a #临时 free -lhgt #查看分区空间
6.4 修改主机名: hostnamectl set-hostname hostnamectl set-hostname k8smaster
6.5 在 master 主机添加 hosts,节点机上无需执行。 cat >> /etc/hosts << EOF 192.168.59.133 k8smaster 192.168.59.134 k8snode1 192.168.59.135 k8snode2 EOF
6.6 修改内核参数,将桥接的 IPv4流量传递到iptables的链,所有节点服务器都要执行。 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
cat /etc/sysctl.d/k8s.conf #查看配置参数 sysctl --system #立即生效
6.7 设置时间同步 yum install ntpdate -y ntpdate time.windows.com ntpdate ntp.aliyun.com
echo '*/15 * * * * ntpdate ntp.aliyun.com > /dev/null 2>&1' >> /var/spool/cron/root crontab -l
7、所有机器安装Docker/kubeadm/kubelet/kubectl Kubernetes默认CRI (容器运行时)为Docker因此先安装Docker。
7.1 安装Docker 执行以下命令来列出所有可用的Docker版本 yum list docker-ce --showduplicates | sort -r wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
配置阿里Docker源: cat >> /etc/yum.repos.d/docker.repo <<EOF [docker-repo] name=Docker Repository baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7 enabled=1 gpgcheck=0 EOF
yum install -y docker-ce docker-ce-cli http://containerd.io
yum install -y docker-ce-18.06.1.ce-3.el7
设置 Docker 加速器 cat > /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com","https://rrnv06ig.mirror.aliyuncs.com","https://reg-mirror.qiniu.com","https://docker.mirrors.ustc.edu.cn"] } EOF
service docker start systemctl status docker.service systemctl daemon-reload && systemctl restart docker && systemctl enable docker
7.2 在所有节点服务器上安装cri-docker的包 项目下载路径如下: https://github.com/Mirantis/cri-dockerd/releases/tag/v0.3.2
通过rpm指令安装
Preparing... ################################# [100%] Updating / installing... 1:cri-dockerd-3:0.3.2-3.el7 ################################# [100%]
修改配置cri-docker使用国内镜像 /usr/lib/systemd/system/cri-docker.service sed -i "s#^ExecStart.*#ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9#" /usr/lib/systemd/system/cri-docker.service
启动服务 systemctl daemon-reload && systemctl start cri-docker && systemctl enable cri-docker
查看服务状态 systemctl status cri-docker systemctl is-active docker cri-docker #检查docker、cri-docker状态
7.3 添加阿里云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=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
7.3 安装kubeadm、kubelet和kubectl
yum list kubeadm --showduplicates | sort -r yum install -y kubectl-1.18.0 kubelet-1.18.0 kubeadm-1.18.0 yum install -y kubeadm-1.26.3 kubectl-1.26.3 kubelet-1.26.3 yum install -y kubelet-1.25.2 kubeadm-1.25.2 kubectl-1.25.2 yum install -y kubelet-1.25.10 kubeadm-1.25.10 kubectl-1.25.10 yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 --disableexcludes=kubernetes yum install -y kubelet kubeadm kubectl
yum downgrade kubelet-1.24.1 kubeadm-1.24.1 kubectl-1.24.1 #降级安装版本
systemctl status kubelet.service systemctl enable kubelet #设置成开机启动 systemctl start kubelet kubelet --version
ps -ef|grep kube-apiserver ps -ef|grep kube-kubelet ps -ef|grep kube-scheduler
systemctl status kubelet | journalctl -xe journalctl -u kubelet --no-pager #查看启动报错日志,--no-pager 参数可以一次性输出日志。 journalctl -xefu kubelet journalctl -u kubelet -f journalctl -xe -u kubelet
查看kubeadm使用的镜像 kubeadm config images list
7.4 部署kubernets Master 在59.133 (Master) 节点上执行 kubeadm init --apiserver-advertise-address=192.168.59.133 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.27.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 注意:--kubernetes-version 使用机器上安装的真实版本
kubeadm config imgaes pull 拉取镜像,会有如下的提示信息,说明镜像拉取成功。
kubeadm join 192.168.. 在node 节点上执行,向集群添加新节点。
kubeadm init初始化报错解决,可以尝试使用下面的指令执行。
kubeadm init --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=Swap
kubeadm init 参数说明 参数值 说明 备注 --kubernetes-version v1.26.2 初始化时指定k8s的版本号 --apiserver-advertise-address 192.168.59.138 监听的本机地址 --service-cidr 10.96.0.0/12 指定集群虚拟网络 --pod-network-cidr 10.244.0.0/16 指定pod容器网络 --control-plane-endpoint 192.168.59.138:6443 --image-repository registry.aliyuncs.com/google_containers 指定下载镜像 --ignore-preflight-errors Swap 忽略swap错误
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
查看国内镜像
W0527 14:18:35.291846 65668 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://dl.k8s.io/release/stable-1.txt": dial tcp: lookup dl.k8s.io on [::1]:53: read udp [::1]:44172->[::1]:53: read: connection refused W0527 14:18:35.291967 65668 version.go:105] falling back to the local client version: v1.27.2 W0527 14:18:35.292329 65668 images.go:80] could not find officially supported version of etcd for Kubernetes v1.27.2, falling back to the nearest etcd version (3.5.7-0) registry.aliyuncs.com/google_containers/kube-apiserver:v1.27.2 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.27.2 registry.aliyuncs.com/google_containers/kube-scheduler:v1.27.2 registry.aliyuncs.com/google_containers/kube-proxy:v1.27.2 registry.aliyuncs.com/google_containers/pause:3.9 registry.aliyuncs.com/google_containers/etcd:3.5.7-0 registry.aliyuncs.com/google_containers/coredns:v1.10.1
所有节点拉取
kubeadm config images pull --kubernetes-version=v1.27.2 --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock
初始化master节点(仅在master节点执行) kubeadm init --apiserver-advertise-address=192.168.59.133 --kubernetes-version=v1.27.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket=unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers --upload-certs --ignore-preflight-errors=all
常见问题:error: “Failed to load kubelet config file” err=“failed to load Kubelet config file /var/lib/kubelet/config.yaml”
解决方法是:添加启动进程接口路径。 kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm init --image-repository registry.aliyuncs.com/google_containers --ignore-preflight-errors=Swap --cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm reset -f
列出下载的镜像
kubeadm init --apiserver-advertise-address=192.168.59.133 --kubernetes-version=v1.26.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --image-repository registry.aliyuncs.com/google_containers --upload-certs --ignore-preflight-errors=all
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
使用kubectl工具,配置kube的环境变量。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf
kubectl get nodes #获取节点状态
加入 kubernetes Node 在Node 服务器59.134、59.135 节点上执行,向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令: kubeadm join 192.168.59.133:6443 --token 1zobjk.teg9wbpovoa3xkul --discovery-token-ca-cert-hash sha256:1dc06b47eec661408e7a3093e01b40d3436e7a7118509e6c0a274567a01b5964
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token了,执行如下: kubeadm token create --print-join-command
步骤在前 》》部署 CNI 网络插件 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
需要修改 kube-flannel.yml 源文件,修改对比如下几行。
修改好 kube-flannel.yml 配置文件后,安装Flannel网络插件。
namespace/kube-flannel unchanged clusterrole.rbac.authorization.k8s.io/flannel unchanged clusterrolebinding.rbac.authorization.k8s.io/flannel unchanged serviceaccount/flannel unchanged configmap/kube-flannel-cfg unchanged daemonset.apps/kube-flannel-ds configured
默认镜像地址无法服务,sed 命令修改为docker hub 镜像仓库。 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl get pods -n kube-system
kubectl get pod --all-namespaces -o wide
kubectl get pod -o wide
查看pod是否正常、节点是否ready。 kubectl get pod -n kube-system
kubectl describe node #检查日志显示
kubectl describe node 192.168.59.133 |grep cidr #检查日志显示的节点*.*.59.133的cidr
确定 coredns 这两个 pod 处于哪个 node 上 kubectl get pods coredns-7f8cbcb969-sbgmq -n kube-system -o wide
之后查看coredns所需镜像 kubectl get pods coredns-7f8cbcb969-sbgmq -n kube-system -o yaml | grep image
登录coredns所在的node机器,进行手动拉去镜像。
使用describe查看错误信息 kubectl describe pods -n kube-system coredns-7f8cbcb969-jrql5
测试kubernetes集群 在kubernetes集群中创建一个pod,查看是否正常运行。 kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
docker.socket无法停止的解决方案
也就是:这是因为除了docker.service单元文件外,还有一个docker.socket单元文件这是用来激活socket的。这个警告意味着如果你在docker服务没有运行的情况下尝试连接docker套接字,那么systemd会自动为你启动docker。
解决方案:删除如下的docker.socket单元文件,就能解决。 /lib/systemd/system/docker.socket
Dashboard是基于网页的Kubernetes可视化用户界面 使用Dashboard将容器应用部署到Kubernetes集群中,也可以对容器应用排错,还能管理集群资源。可以使用Dashboard获取运行在集群中的应用的概览信息,也可以创建或者修改Kubernetes资源( 如Deployment,Job,DaemonSet等等) Dashboard同时展示了Kubernetes集群中的资源状态信息和所有报错信息。 下载页面中看到dashboard v2.7.0是支持Kuberneres 1.25版本的 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
验证,查看pod的状态为running说明dashboard部署成功。
打印初始化时配置,可查看cgroupDriver默认值
kubeadm基于docker安装高可用1.26.3版本k8s集群 https://developer.aliyun.com/article/1230968?spm=a2c6h.14164896.0.0.1fc5d58cm1IHvs
Kubeadm 快速搭建 k8s v1.24.1 集群(openEuler 22.03 LTS) https://developer.aliyun.com/article/1172745?spm=a2c6h.14164896.0.0.1fc5d58cm1IHvs
k8s 1.26.2基于containerd1.6.18 https://developer.aliyun.com/article/1230630?spm=a2c6h.14164896.0.0.59d16d139wsgHv
【kubernetes】从零开始搭建K8S集群 https://developer.aliyun.com/article/1226818?spm=a2c6h.14164896.0.0.354a6d13pCrAjl