my Kubernetes study

Kubernetes (k8s) 搭建过程

1、安装要求 安装三台虚拟机,硬件规划配置大致如下:

image

上面的服务器配置可以搭建一套单master集群

Operating System: CentOS Linux 7 (Core) Kernel: Linux 3.10.0-862.el7.x86_64 Architecture: x86-64

cat /etc/redhat-release

CentOS Linux release 7.9.2009 (Core) image

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}'

route -n

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

cat /etc/resolv.conf

Generated by NetworkManager

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

systemctl restart containerd # systemctl status containerd

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指令安装

rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.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

如果没有报错那cri没问题,否则需要检查。

查看服务状态 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 国内无法访问,这里指定阿里云镜像仓库地址。

查看国内镜像

kubeadm config images list --image-repository registry.aliyuncs.com/google_containers

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 config images list --image-repository registry.aliyuncs.com/google_containers

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 $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

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 源文件,修改对比如下几行。

diff kube-flannel.yml.bak0603 kube-flannel.yml

修改好 kube-flannel.yml 配置文件后,安装Flannel网络插件。

kubectl apply -f kube-flannel.yml

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

kubectl describe pods -n kube-flannel kube-flannel-ds-th426

kubectl describe pods -n kube-system kube-apiserver-k8smaster

测试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部署成功。

yum install flannel -y

sysctl -a |grep bridge-nf-call

打印初始化时配置,可查看cgroupDriver默认值

kubeadm config print init-defaults --component-configs KubeletConfiguration

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