K8s学习笔记
K8s的学习需要有docker和docker-compose的基础
集群架构与组件
-
相关组件
- 控制面板组件
- etcd
- kube-apiserver
- kube-controller=manager
- cloud-controller-manager
- kube-scheduler
- 节点组件
- kubelet
- kube-proxy
- container runtime
- 附加组件
- kube-dns
- Ingress Controller
- Heapster
- Dashboard
- Federation
- Fluentd-elasticsearch
- 分层架构
-
命名空间级
- 工作负载型
- Pod
- 副本
- 控制器
- 适用于无状态
- ReplicationController
- ReplicaSet
- Deployment
- 适用于有状态
- 守护进程 DaemonSet
- 任务/定时任务 Job 和CronJob
- 服务发现与负载均衡
- 配置与存储
- 特殊类型存储
- ConfigMap
- Secret
- DownwardAPI
- 其他
-
搭建方案
- minikube
- kubeadm
- 二进制安装(推荐)
- 命令行工具(简单)
-
命令行工具 kubectl
-
深入pod
-
探测方式
-
探针
-
类型
- startupProbe
- LivenessProbe
- ReadinessProbe
-
参数类型
-
生命周期
实操
安装K8s
k8s在1.24.0之后就不支持docker了,因为docker不支持cri规范,所以这里装的k8s是之前版本的
尝试一
目前安装k8s的方法有很多种,主要是kubeadm,kops,Rancher,手动部署,kubespray。
比较推荐的是kubespray,但是我照着一个教程搞了一半了,先解决shell脚本的吧。
这里的docker脚本用不了了,可以换成我的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
| #!/bin/bash # Kubernetes部署环境要求: #(1)一台或多台机器,操作系统CentOS 7.x-86_x64 #(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+; #(3)集群内各个机器之间能相互通信; #(4)集群内各个机器可以访问外网,需要拉取镜像; #(5)禁止swap分区;
# 安装步骤 #1. 安装docker #1.1 如果没有安装docker,则安装docker。会附带安装一个docker-compose #
#2.1 初始化环境 #2.2 添加安装源 #2.3 安装kubelet、kubectl、kubeadmin #2.4 安装master #2.5 安装网络插件
set -e
# 安装日志 install_log=/var/log/install_k8s.log tm=$(date +'%Y%m%d %T')
# 日志颜色 COLOR_G="\x1b[0;32m" # green RESET="\x1b[0m"
function info(){ echo -e "${COLOR_G}[$tm] [Info] ${1}${RESET}" }
function run_cmd(){ sh -c "$1 | $(tee -a "$install_log")" }
function run_function(){ $1 | tee -a "$install_log" }
function install_docker(){ info "1.使用脚本自动安装docker..." curl -sSL https://get.daocloud.io/docker | sh
info "2.启动 Docker CE..." sudo systemctl enable docker sudo systemctl start docker
info "3.添加镜像加速器..." if [ ! -f "/etc/docker/daemon.json" ];then touch /etc/docker/daemon.json fi cat <<EOF > /etc/docker/daemon.json { "registry-mirrors": [ "https://5ajk0rns.mirror.aliyuncs.com" ] } EOF
info "4.重新启动服务..." sudo systemctl daemon-reload sudo systemctl restart docker
info "5.测试 Docker 是否安装正确..." docker run hello-world
info "6.检测..." docker info
read -p "是否安装docker-compose?默认为 no. Enter [yes/no]:" is_compose if [[ "$is_compose" == 'yes' ]];then info "7.安装docker-compose" sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod a+x /usr/local/bin/docker-compose
# 8.验证是否安装成功 info "8.验证docker-compose是否安装成功..." docker-compose -v fi }
function install_k8s() { info "初始化k8s部署环境..." init_env
info "添加k8s安装源..." add_aliyun_repo
info "安装kubelet kubeadmin kubectl..." install_kubelet_kubeadmin_kubectl
info "安装kubernetes master..." yum -y install net-tools if [[ ! "$(ps aux | grep 'kubernetes' | grep -v 'grep')" ]];then kubeadmin_init else info "kubernetes master已经安装..." fi
info "安装网络插件flannel..." install_flannel
info "去污点..." kubectl taint nodes --all node-role.kubernetes.io/master- }
# 初始化部署环境 function init_env() { info "关闭防火墙" systemctl stop firewalld systemctl disable firewalld
info "关闭selinux" sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config source /etc/selinux/config
info "关闭swap(k8s禁止虚拟内存以提高性能)" swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
info "设置网桥参数" cat <<-EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #生效 sysctl -w net.ipv4.ip_forward=1
info "时间同步" yum install ntpdate -y ntpdate time.windows.com }
# 添加aliyun安装源 function add_aliyun_repo() { 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 }
function install_kubelet_kubeadmin_kubectl() { yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y systemctl enable kubelet.service
info "确认kubelet kubeadmin kubectl是否安装成功" yum list installed | grep kubelet yum list installed | grep kubeadm yum list installed | grep kubectl kubelet --version }
function kubeadmin_init() { sleep 1 read -p "请输入master ip地址:" ip kubeadm init --apiserver-advertise-address="${ip}" --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p "$HOME"/.kube sudo cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config sudo chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config }
function install_flannel() { yum -y install wget wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml }
# 安装docker read -p "是否安装docker?默认为:no. Enter [yes/no]:" is_docker if [[ "$is_docker" == 'yes' ]];then run_function "install_docker" fi
# 安装k8s read -p "是否安装k8s?默认为:no. Enter [yes/no]:" is_k8s if [[ "$is_k8s" == 'yes' ]];then run_function "install_k8s" fi
|
- kubectl get nodes发现主节点unhealthy
- 检查日志的时候发现有问题
这两个pod的非安全端口没有开启,健康检查时报错,但是由于本身服务是正常的,只是健康检查的端口没启,所以不影响正常使用。先不管了
但是还是有正在Pending的情况
1
| kubectl get pods -n kube-system
|
发现coredns一直pending,解决不了,只能放弃上面的脚本安装了。
卸载k8s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| 1、停止相关服务
systemctl stop kubelet
systemctl stop etcd
systemctl stop docker
2、卸载k8s
kubeadm reset -f
3、删除k8s相关目录
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
4、卸载k8s相关程序
yum -y remove kube*
5、更新镜像
yum clean all
yum -y update
yum makecache
|
使用kubespray安装k8s
1 2 3 4 5 6 7 8 9 10 11
| #!/bin/bash yum install epel-release -y
yum install ansible -y
yum -y install python-pip
pip install netaddr
pip install --upgrade jinja2
|
配置ssh/scp免密登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| if [ "$#" -ne 1 ]; then echo "Usage: $0 B_IP" exit 1 fi
B_IP=$1
# 1.1 检查并生成密钥对(如果需要) if [ ! -f ~/.ssh/id_rsa ]; then ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa else echo "SSH key pair already exists, skipping generation." fi
# 1.2 拷贝 A 的公钥(id_rsa.pub)到 B scp ~/.ssh/id_rsa.pub root@$B_IP:/root
# 1.3 登录 B,拷贝 A 的 id_rsa.pub 内容到 .ssh 目录下的 authorized_keys 文件中 ssh root@$B_IP "mkdir -p ~/.ssh && cat /root/id_rsa.pub >> ~/.ssh/authorized_keys && rm /root/id_rsa.pub"
# 1.4 设置权限 ssh root@$B_IP "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
# 2. 测试免密码登录 echo "Testing SSH login to B without password..." ssh root@$B_IP 'echo SSH login successful!'
echo "Setup complete!"
|
尝试二
在第一次尝试失败之后,我感觉应该需要更加细致的教程才适合k8s这么繁琐的配置,于是去b站上找了,第二次尝试也是终于成功了。课程链接我放到底下了,它的第20章是开始实操的部分,可以直接看那里。
Troubleshooting
问题一
按照教程走,应该问题不大的。但是我还是踩了一些坑,首先是kubectl的一直启动不起来。状态可以通过这个命令查看。
1
| systemctl status kubectl
|
这是因为我的swap没有关,全部虚拟机的swap都要关掉。可以用下面的命令:
问题二
如果在执行yum install上出问题,第一考虑没有加yum源
1 2 3 4 5 6 7 8 9 10
| 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
|
第二考虑,没有yum缓存导致问题
然后再
命令执行成功即可。
问题三
- kubeadm init发现kubectl健康检查失败
首先,查看/etc/hostname是否有你设置的主机名,我这里设置的是k8s-master。然后查看kubectl状态,是active还不行,要查看日志看是否正常启动:
1
| journalctl -u kubelet -f
|
1 2 3 4 5
| 7月 16 06:35:31 k8s-master kubelet[25841]: E0716 06:35:31.444878 25841 kubelet.go:2461] "Error getting node" err="node \"k8s-master\" not found" 7月 16 06:35:31 k8s-master kubelet[25841]: E0716 06:35:31.549945 25841 kubelet.go:2461] "Error getting node" err="node \"k8s-master\" not found" 7月 16 06:35:31 k8s-master kubelet[25841]: E0716 06:35:31.655950 25841 kubelet.go:2461] "Error getting node" err="node \"k8s-master\" not found" 7月 16 06:35:31 k8s-master kubelet[25841]: E0716 06:35:31.761124 25841 kubelet.go:2461] "Error getting node" err="node \"k8s-master\" not found" 7月 16 06:35:31 k8s-master kubelet[25841]: E0716 06:35:31.866043 25841 kubelet.go:2461] "Error getting node" err="node \"k8s-master\" not found"
|
找不到节点,这个我是通过重启虚拟机解决的。
进行init操作失败了之后,要进行复原。就是把新增的文件夹和容器删掉,再重新进行init,文件夹多出来的再次进行init的时候会告诉你的。
删除全部容器可以使用这个命令
1
| docker rm -f $(docker ps -a -q)
|
问题四
组件一直是init或者pending,我用
1 2
| kubectl describe 组件名 -n 容器范围 kubectl describe calico -n kube-system
|
查看组件日志。发现是一直在拉取镜像。由于国内网络原因,国外的docker.io的镜像拉去十分困难,这里我们可以通过从国内镜像站拉去的办法解决:
1 2 3
| docker pull calico/cni:v3.25.0 calico/cni:v3.25.0 calico/node:v3.25.0 calico/node:v3.25.0 calico/kube-controllers:v3.25.0
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.25.0 calico/node:v3.25.0
|
这里只是拿了其中一个镜像举了例子,其他的也是同理。还有全部k8s的服务器都需要拉取一遍哦!
参考文献
搞多台节点的时候固定ip
[NotReady问题解决](k8s部署解成功解决node节点一直处于NotReady状态的问题,报错failed to load Kubelet config file /var/lib/kubelet/config.yaml_failed to load kubelet config file" err="failed to-CSDN博客)
[kubernetes可用shell脚本来源](【kubernetes】史上最简单的k8s安装教程,一键安装 - 掘金 (juejin.cn))
K8S多种安装方式简介
b站kubeadm安装k8s的微服务课程