云原生Kubernetes:Kubeadm部署K8S单Master架构
目录
一、理论
1.kubeadm
2.Kubeadm部署K8S单Master架构
3.环境部署
4.所有节点安装docker
5.所有节点安装kubeadm,kubelet和kubectl
6.部署K8S集群
7.安装dashboard
8.安装Harbor私有仓库
9.内核参数优化方案
二、实验
1.Kubeadm部署K8S单Master架构
2. 部署流程
3.环境部署
4.所有节点安装docker
5.所有节点安装kubeadm,kubelet和kubectl
6.部署K8S集群
7.安装dashboard
8.安装Harbor私有仓库
三、问题
1.加入k8s集群报错
2.Kubernetes各版本对应支持的docker版本列表
3.Kubernetes 1.24 1.25 集群使用docker作为容器
4.连接拒绝
5.kubeadm join命令将node加入master时报错
6.coredns一直处于ContainerCreating
7.flannel如何分配子网
8.其他机器无法登陆Harbor
四、总结
一、理论
1.kubeadm
(1) 概念
Kubeadm 是一个提供了 kubeadm init
和 kubeadm join
的工具, 作为创建 Kubernetes 集群的 “快捷途径” 的最佳实践。
kubeadm 通过执行必要的操作来启动和运行最小可用集群。 按照设计,它只关注启动引导,而非配置机器。同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。
相反,在 kubeadm 之上构建更高级别以及更加合规的工具, 理想情况下,使用 kubeadm 作为所有部署工作的基准将会更加易于创建一致性集群
(2)管理命令
kubeadm init 用于搭建控制平面节点
kubeadm join 用于搭建工作节点并将其加入到集群中
kubeadm upgrade 用于升级 Kubernetes 集群到新版本
kubeadm config 如果你使用了 v1.7.x 或更低版本的 kubeadm 版本初始化你的集群,则使用 kubeadm upgrade 来配置你的集群
kubeadm token 用于管理 kubeadm join 使用的令牌
kubeadm reset 用于恢复通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更
kubeadm certs 用于管理 Kubernetes 证书
kubeadm kubeconfig 用于管理 kubeconfig 文件
kubeadm version 用于打印 kubeadm 的版本信息
kubeadm alpha 用于预览一组可用于收集社区反馈的特性
2.Kubeadm部署K8S单Master架构
(1)架构
(2)软件包
本次实验所需要的软件:
【免费】K8S单Master节点kubeadm方式(软件与配置文件)资源-CSDN文库
(3)部署流程
1、在所有节点上安装Docker和kubeadm
2、部署Kubernetes Master
3、部署容器网络插件
4、部署 Kubernetes Node,将节点加入Kubernetes集群中
5、部署 Dashboard Web 页面,可视化查看Kubernetes资源
6、部署 Harbor 私有仓库,存放镜像资源
3.环境部署
(1)所有节点,关闭防火墙规则,关闭selinux,关闭swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a #交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
(2)加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
(3)修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02
所有节点修改hosts文件
vim /etc/hosts
192.168.204.171 master
192.168.204.173 node01
192.168.204.175 node02
(4)调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF生效参数
sysctl --system
4.所有节点安装docker
(1)安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
(2)加速地址(需要修改为自己的)
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service docker info | grep "Cgroup Driver"
Cgroup Driver: systemd
5.所有节点安装kubeadm,kubelet和kubectl
(1)定义kubernetes源
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
EOFyum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1
开机自启kubelet
systemctl enable kubelet.service
6.部署K8S集群
(1)查看初始化需要的镜像
kubeadm config images list
(2)在 master 节点上传 kubeadm-basic.images.tar.gz 压缩包至 /opt 目录
cd /opt
tar zxvf kubeadm-basic.images.tar.gz
(3)使用for循环载入镜像
for i in $(ls /opt/kubeadm-basic.images/*.tar); do docker load -i $i; done
(4)复制镜像和脚本到 node 节点,并在 node 节点上执行脚本 bash /opt/load-images.sh
scp -r kubeadm-basic.images root@node01:/opt
scp -r kubeadm-basic.images root@node02:/opt
(5)初始化kubeadm
方法一:
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
修改配置文件
cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.204.171 #指定master节点的IP地址
13 bindPort: 6443
......
34 kubernetesVersion: v1.15.1 #指定kubernetes版本号
35 networking:
36 dnsDomain: cluster.local
37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38 serviceSubnet: 10.96.0.0/16 #指定service网段
39 scheduler: {}
--- #末尾再添加以下内容
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默认的service调度方式改为ipvs模式
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,k8sV1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志//查看 kubeadm-init 日志
less kubeadm-init.log//kubernetes配置文件目录
ls /etc/kubernetes///存放ca等证书和密码的目录
ls /etc/kubernetes/pki
方法二:
kubeadm init \
--apiserver-advertise-address=0.0.0.0 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.15.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
--service-cidr:service资源的网段
--service-dns-domain:service全域名的后缀,默认是cluster.local
---------------------------------------------------------------------------------------------方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs
kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs提示:
......
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.204.171:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:594fd0a687443eb0f161d9ae76efcf27588af78579c8e362d70fc06986f0454b
更改kube-proxy配置
kubectl edit configmap kube-proxy -n kube-system
找到如下部分的内容
minSyncPeriod: 0sscheduler: ""syncPeriod: 30skind: KubeProxyConfigurationmetricsBindAddress: 127.0.0.1:10249mode: "ipvs" # 加上这个nodePortAddresses: null
其中mode原来是空,默认为iptables模式,改为ipvs
scheduler默认是空,默认负载均衡算法为轮询
编辑完,保存退出
(6)设定kubectl
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
在 node 节点上执行 kubeadm join 命令加入群集
kubeadm join 192.168.204.171:6443 --token d3q8kf.wvis2wbfdfymwic4 \--discovery-token-ca-cert-hash sha256:6d851b46ccd6c61a81d3aa08eae4971bc7a5ba32dd4918f7981c482e3fdd4d52
(7)所有节点部署网络插件flannel
方法一:
所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
cd /opt
docker load < flannel.tar
在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml
方法二:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在master节点查看节点状态(需要等几分钟)
kubectl get nodeskubectl get pods -n kube-system
测试 pod 资源创建
kubectl create deployment nginx --image=nginx
暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePort
测试访问
curl http://node01:30833
扩展3个副本
kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide
7.安装dashboard
(1)所有节点安装dashboard
方法一:
所有节点上传dashboard镜像 dashboard.tar 到 /opt 目录,master节点上传kubernetes-dashboard.yaml文件
cd /opt/
docker load < dashboard.tarkubectl apply -f kubernetes-dashboard.yaml
方法二:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
查看所有容器运行状态
kubectl get pods,svc -n kube-system -o wide
使用浏览器访问
https://node02:30001/https://192.168.204.175:30001/
创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-systemkubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取令牌密钥
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
复制token令牌直接登录网站
8.安装Harbor私有仓库
(1)在192.168.204.176服务器操作
修改主机名
hostnamectl set-hostname hub.david.com
所有节点加上主机名映射
echo '192.168.204.176 hub.david.com' >> /etc/hosts
(2) 安装 docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
私有仓库配置(加速地址需要修改为自己的)
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.david.com"]
}
EOFsystemctl start docker
systemctl enable docker
所有 node 节点都修改 docker 配置文件,加上私有仓库配置(加速地址需要修改为自己的)
cat /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.david.com"]
}
EOF
(3)安装 Harbor
上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
tar zxvf harbor-offline-installer-v1.2.2.tgz
cd harbor/
vim harbor.cfg
5 hostname = hub.david.com
9 ui_url_protocol = https
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
59 harbor_admin_password = Harbor12345
生成证书
mkdir -p /data/cert
cd /data/cert
#生成私钥
openssl genrsa -des3 -out server.key 2048
输入两遍密码:123456
[root@hub cert]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:JS
Locality Name (eg, city) [Default City]:NJ
Organization Name (eg, company) [Default Company Ltd]:DAVID
Organizational Unit Name (eg, section) []:DAVID
Common Name (eg, your name or your server's hostname) []:hub.david.com
Email Address []:admin@david.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@hub cert]#
备份私钥
cp server.key server.key.org
清除私钥密码
openssl rsa -in server.key.org -out server.key
输入私钥密码:123456
签名证书
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
chmod +x /data/cert/*cd /opt/harbor/
./install.sh
浏览器访问
浏览器访问:https://hub.david.com
用户名:admin
密码:Harbor12345
在一个node节点上登录harbor
docker login -u admin -p Harbor12345 https://hub.david.com
上传镜像
docker tag nginx:latest hub.david.com/library/nginx:v1
docker push hub.david.com/library/nginx:v1
在master节点上删除之前创建的nginx资源
kubectl delete deployment nginxkubectl run nginx-deployment --image=hub.david.com/library/nginx:v1 --port=80 --replicas=3kubectl expose deployment nginx-deployment --port=30000 --target-port=80kubectl get svc,pods
yum install ipvsadm -y
ipvsadm -Ln
登录测试一下
curl 10.96.14.134:30000
kubectl edit svc nginx-deployment25 type: NodePort #把调度策略改成NodePort
浏览器访问
kubectl get svc浏览器访问:192.168.204.171:30118192.168.204.173:30118192.168.204.175:30118
9.内核参数优化方案
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁止使用 swap 空间,只有当系统内存不足(OOM)时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963 #指定最大文件句柄数
fs.nr_open=52706963 #仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
二、实验
1.Kubeadm部署K8S单Master架构
(1)环境
表1 环境
master | 192.168.204.171 | docker、kubeadm、kubelet、kubectl、flannel | 4C/4G,cpu核心数要求大于2 |
node01 | 192.168.204.173 | docker、kubeadm、kubelet、kubectl、flannel | 2C/2G |
node02 | 192.168.204.175 | docker、kubeadm、kubelet、kubectl、flannel | 2C/2G |
Harbor节点 | 192.168.204.176 | docker、docker-compose、harbor-offline-v1.2.2 | 4C/4G |
2. 部署流程
1、在所有节点上安装Docker和kubeadm
2、部署Kubernetes Master
3、部署容器网络插件
4、部署 Kubernetes Node,将节点加入Kubernetes集群中
5、部署 Dashboard Web 页面,可视化查看Kubernetes资源
6、部署 Harbor 私有仓库,存放镜像资源
3.环境部署
(1)所有节点,关闭防火墙规则,关闭selinux,关闭swap交换for i in $(ls
(2)加载 ip_vs 模块
(3)修改主机名
所有节点修改hosts文件
(4)调整内核参数
master
node1
node2
4.所有节点安装docker
(1)安装
安装依赖包
添加repo
安装docker
(2)加速地址
启动
5.所有节点安装kubeadm,kubelet和kubectl
(1)定义kubernetes源
安装
开机自启kubelet
6.部署K8S集群
(1)查看初始化需要的镜像
(2)在 master 节点上传 kubeadm-basic.images.tar.gz 压缩包至 /opt 目录
(3)使用for循环载入镜像
(4)复制镜像和脚本到 node 节点,并在 node 节点上执行脚本 bash /opt/load-images.sh
(5)初始化kubeadm
方法一:
修改配置文件
启动
因老版本问题,如此方法启动失败,需要降级docker版本并采用第二种方法
方法二:
kubernetes配置文件目录存放ca等证书和密码的目录
(6)设定kubectl
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
master节点生成token
在 node 节点上执行 kubeadm join 命令加入群集
查看所有节点(目前状态为NotReady)
(7)所有节点部署网络插件flannel
方法一:
所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
在 master 节点创建 flannel 资源
在master节点查看节点状态(需要等几分钟)
测试 pod 资源创建
暴露端口提供服务
查询service
测试访问
扩展3个副本
7.安装dashboard
(1)所有节点安装dashboard
方法一:
所有节点上传dashboard镜像 dashboard.tar 到 /opt 目录,master节点上传kubernetes-dashboard.yaml文件
查看所有容器运行状态
使用浏览器访问
创建service account并绑定默认cluster-admin管理员集群角色
获取令牌密钥
需要输入令牌
复制token令牌直接登录网站
登录成功
8.安装Harbor私有仓库
(1)在192.168.204.176服务器操作
修改主机名
所有节点加上主机名映射
(2) 安装 docker
已安装(经过20到18版本降级处理)
修改镜像加速地址,所有 node 节点都修改 docker 配置文件,加上私有仓库配置
启动
(3)安装 Harbor
上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录
修改配置文件
生成证书,输入两遍密码:123456
生成证书
备份私钥
清除私钥密码
签名证书,输入私钥密码:123456
浏览器访问
登录界面
输入账户密码
登录成功
在一个node节点上登录harbor
上传镜像
推送成功
在master节点上删除之前创建的nginx资源
安装
登录测试一下
把调度策略改成NodePort
获取物理机端口映射地址为30118
浏览器访问:192.168.204.171:30118192.168.204.173:30118192.168:204.175:30118
三、问题
1.加入k8s集群报错
(1)报错
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 24.0.5. Latest validated version: 18.09
(2)原因分析
此 Docker 版本不在已验证版本列表中:24.0.5。 最新验证版本:18.09
(3)解决方法
分别查看docker和k8s的版本
kubectl version
docker version
降低docker版本到18.09
查看当前仓库支持的docker版本:
yum list docker-ce --showduplicates | sort -r
选择18.09的版本,降级到18.06版本会报错
语法: yum downgrade --setopt=obsoletes=0 -y docker-ce-v e r s i o n d o c k e r − c e − s e l i n u x − {version} docker-ce-selinux-versiondocker−ce−selinux−{version}
降低docker版本到18.06.3.ce-3.el7
yum downgrade --setopt=obsoletes=0 -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io
查看降级后版本
systemctl start docker
docker version
2.Kubernetes各版本对应支持的docker版本列表
(1)解决
Kubernetes主要做Docker的容器化管理,总结一下如何查看k8s对应支持的docker版本的方法。
在GitHub可以查看所有Kubernetets版本信息:https://github.com/kubernetes/kubernetes/releases
截止2019.08.09最新的版本支持信息:Kubernetes 1.15.2 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.15.1 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.15.0 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.5 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.4 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.3 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.2 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.1 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.14.0 –>Docker版本1.13.1、17.03、17.06、17.09、18.06、18.09Kubernetes 1.13.5 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.5 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.4 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.3 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.2 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.1 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.13.0 –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.12.* –>Docker版本1.11.1、1.12.1、1.13.1、17.03、17.06、17.09、18.06Kubernetes 1.11.* –>Docker版本1.11.2到1.13.1、17.03Kubernetes 1.10.* –>Docker版本1.11.2到1.13.1、17.03
查看方式:
1)老版本
点击链接进入到GitHub中查找对应的版本后点击 CHANGELOG-1.15.md
点进去查找docker versions:(页面现在存在404情况)
2)新版本:
点击链接进入到GitHub中查找对应的版本后点击 the CHANGELOG
3.Kubernetes 1.24 1.25 集群使用docker作为容器
(1)问题
在新版本Kubernetes环境(1.24以及以上版本)下官方不在支持docker作为容器运行时了,若要继续使用docker 需要对docker进行配置一番。需要安装cri-docker作为Kubernetes容器。
(2)解决
查看当前容器运行时
# 查看指定节点容器运行时
kubectl describe node k8s-node1 | grep ContainerContainer Runtime Version: containerd://1.6.8# 查看所有节点容器运行时
kubectl describe node | grep ContainerContainer Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8
安装docker
# 更新源信息
yum update
# 安装必要软件
yum install -y yum-utils device-mapper-persistent-data lvm2# 写入docker源信息
sudo yum-config-manager \--add-repo \https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo# 更新源信息并进行安装
yum update
yum install docker-ce docker-ce-cli containerd.io# 配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
安装cri-docker
# 由于1.24以及更高版本不支持docker所以安装cri-docker
# 下载cri-docker
wget https://ghproxy.com/https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.5/cri-dockerd-0.2.5.amd64.tgz# 解压cri-docker
tar xvf cri-dockerd-0.2.5.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/# 写入启动配置文件
cat > /usr/lib/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinityTasksMax=infinity
Delegate=yes
KillMode=process[Install]
WantedBy=multi-user.target
EOF# 写入socket配置文件
cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target
EOF# 进行启动cri-docker
systemctl daemon-reload ; systemctl enable cri-docker --now
为kubelet配置容器运行时
# 1.25 版本下 所有k8s节点配置kubelet service
cat > /usr/lib/systemd/system/kubelet.service << EOF[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service[Service]
ExecStart=/usr/local/bin/kubelet \\--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \\--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\--config=/etc/kubernetes/kubelet-conf.yml \\--container-runtime-endpoint=unix:///run/cri-dockerd.sock \\--node-labels=node.kubernetes.io/node=[Install]
WantedBy=multi-user.target
EOF# 1.24 版本下 所有k8s节点配置kubelet service
cat > /usr/lib/systemd/system/kubelet.service << EOF[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service[Service]
ExecStart=/usr/local/bin/kubelet \\--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \\--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \\--config=/etc/kubernetes/kubelet-conf.yml \\--container-runtime=remote \\--runtime-request-timeout=15m \\--container-runtime-endpoint=unix:///run/cri-dockerd.sock \\--cgroup-driver=systemd \\--node-labels=node.kubernetes.io/node= \\--feature-gates=IPv6DualStack=true[Install]
WantedBy=multi-user.target
EOF# 重启
systemctl daemon-reload
systemctl restart kubelet
systemctl enable --now kubelet
验证
# 查看指定节点容器运行时
kubectl describe node k8s-node1 | grep ContainerContainer Runtime Version: docker://20.10.17# 查看所有节点容器运行时
kubectl describe node | grep ContainerContainer Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: containerd://1.6.8Container Runtime Version: docker://20.10.17
4.连接拒绝
(1)报错
(2)原因分析
kubectl命令需要使用kubernetes-admin来运行,需要admin.conf文件(conf文件是通过“ kubeadmin init”命令在主节点/etc/kubernetes 中创建),但是从节点没有conf文件,也没有设置 KUBECONFIG =/root/admin.conf环境变量,所以需要复制conf文件到从节点,并设置环境变量就可以了
(3)解决方法
主节点的admin.conf拷贝到从节点,设置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或
#拷贝admin.conf注意路径
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
执行
成功
5.kubeadm join
命令将node
加入master
时报错
(1)报错
节点纳入管理失败,五分钟后超时放弃连接。
出现error execution phase preflight: couldn't validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s
错误
(2)原因分析
token 过期:
此时需要通过kubedam
重新生成token
[root@master opt]# kubeadm token generate
30nu35.cqbsmgdd15xnxh1t#下面这条命令中会用到该结果,根据token输出添加命令
[root@master opt]# kubeadm token create 30nu35.cqbsmgdd15xnxh1t --print-join-command --ttl=0
kubeadm join 192.168.204.171:6443 --token 30nu35.cqbsmgdd15xnxh1t --discovery-token-ca-cert-hash sha256:6d851b46ccd6c61a81d3aa08eae4971bc7a5ba32dd4918f7981c482e3fdd4d52
k8s api server不可达:
此时需要检查和关闭所有服务器的firewalld
和selinux
[root@master ~]#setenforce 0
[root@master ~]#sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@master ~]#systemctl disable firewalld --now
(3)解决
6.coredns一直处于ContainerCreating
(1)报错
coredns一直处于ContainerCreating状态
(2)原因分析
查询pod状态
kubectl describe pods -n kube-system coredns-bccdc95cf-fjskt
最后的事件监听为:
发现这里报错了:
FailedCreatePodSandBox: Failed create pod sandbox
执行命令查看日志:
sudo journalctl -xe | grep cni
发现为:
ailed to find plugin "flannel" in path [/opt/cni/bin]
然后去/usr/local/bin目录下,发现在master和worker节点忘记拷贝flannel命令了。
(3)解决方法
需要下载CNI插件:CNI plugins v0.8.6
github下载地址:https://github.com/containernetworking/plugins/releases/tag/v0.8.6
(在1.0.0版本后CNI Plugins中没有flannel)
①下载后通过xftp 上传到Linux /home目录解压
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
1) node1节点
2) node2节点
② 复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
1)node1节点
2)node2节点
成功
7.flannel如何分配子网
(1)配置--pod-network-cidr
kubeadm init \
--apiserver-advertise-address=0.0.0.0 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.15.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
(2)更改kube-proxy配置
更改
kubectl edit configmap kube-proxy -n kube-system
找到如下部分的内容
minSyncPeriod: 0sscheduler: ""syncPeriod: 30skind: KubeProxyConfigurationmetricsBindAddress: 127.0.0.1:10249mode: "ipvs" # 加上这个nodePortAddresses: null
其中mode原来是空,默认为iptables模式,改为ipvs
scheduler默认是空,默认负载均衡算法为轮询
(3)查看
cd /run/flannel/vim subnet.env
master节点:
node1节点:
node2节点
8.其他机器无法登陆Harbor
(1)报错
(2)原因分析
配置文件错误
(3)解决方法
检查docker
的daemon.json
是否配置了insecure-registries
。配置好后,需要使用systemctl reload docker
重启docker
服务。
修改前:
少一个逗号
修改后:
使用docker info
查看配置
修改前:
修改后:
成功
9.pod删除不了
(1) 报错
pod镜像拉取失败一直删除不了
(2)原因分析
命令缺少pod
# 加pod
kubectl delete pod nginx-deployment-6959f4b694-nds9nkubectl delete pod nginx-deployment-6959f4b694-qmpd6
(3)解决
查看rs和deployment以及pod
kubectl get pods -o widekubectl get deployment
删除deployment
kubectl delete deployment nginx-deployment
再次查看deployment
再次查看pod,发现已成功删除
四、总结
K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启。
使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
相关文章:

云原生Kubernetes:Kubeadm部署K8S单Master架构
目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm,kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …...

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显…...

开发指导—利用 CSS 动画实现 HarmonyOS 动效(二)
注:本文内容分享转载自 HarmonyOS Developer 官网文档 点击查看《开发指导—利用CSS动画实现HarmonyOS动效(一)》 3. background-position 样式动画 通过改变 background-position 属性(第一个值为 X 轴的位置,第二个…...

音频修复和增强工具 iZotope RX 10 for mac激活最新
iZotope RX 10是一款音频修复和增强软件,主要特点包括: 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…...

SpringMVC的简介及工作流程
一.简介 Spring MVC是一个基于Java的开发框架,用于构建灵活且功能强大的Web应用程序。它是Spring Framework的一部分,提供了一种模型-视图-控制器(Model-View-Controller,MVC)的设计模式,用于组织和管理Web…...

JVM垃圾回收机制和常用算法(简洁版)
垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是…...

C/C++源程序到可执行程序exe的全过程(及汇编和反汇编的区别)
1.C/C源程序到可执行程序exe的全过程(及汇编和反汇编的区别) 一个现代编译器的主要工作流程如下: 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇…...

信创优选,国产开源。Solon v2.5.3 发布
Solon 是什么? 国产的 Java 应用开发框架。从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模)。与其他框架相比,解决了两个重要的痛点:启动慢,费内存…...

ElementUI浅尝辄止25:MessageBox 弹框
模拟系统的消息提示框而实现的一套模态对话框组件,用于消息提示、确认消息和提交内容。 从场景上说,MessageBox 的作用是美化系统自带的 alert、confirm 和 prompt,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,还是要…...

ElasticSearch简介
一、基本概念 1、Index(索引) 动词,相当于 MySQL 中的 insert; 名词,相当于 MySQL 中的 Database 2、Type(类型) 在 Index(索引)中,可以定义一个或多个类…...

基于亚马逊云科技打造的游戏AIGC专业版,创梦天地快速上线AI生图服务
生成式人工智能(以下简称“生成式AI”)的热潮正在全球范围内掀起新一轮的科技革命,释放出巨大的商业价值。各类“AI绘画神器”的涌现,为创意行业带来了翻天覆地的变化。 在游戏领域,生成式AI技术也吸引了玩家们的广泛关…...

Debian离线安装mysql
PS:虽然已经分享了很多安装各种环境订的教程,但是每个客户的环境不一样,那就得重新来一次,其实都是大同小异的,但是里面其实也是存在不少坑的,今天我们就来安装一个新的东西,Debian 11离线安装mysql,为什么…...

Linux代码初试__进度条
前言 在我们的日常生活中,进度条是十分常见的,比如在软件下载中,应用加载中等等~~~那么进度条有什么特点?他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…...

美国访问学者签证有哪些要求?
近年来,越来越多的学者选择前往美国进行访问学者签证,以便深入研究、学术交流以及开展合作项目。美国访问学者签证是一个重要的工具,为学者们提供了在美国学术机构进行短期或长期学术活动的机会。下面知识人网将介绍一些申请美国访问学者签证…...

如何利用客户旅程打造好的用户体验?
在当今竞争激烈的市场中,提供卓越的用户体验已经成为企业脱颖而出的关键因素之一。客户旅程是实现出色用户体验的有力工具之一,而HubSpot的客户旅程规划功能为企业提供了强大的支持,帮助他们更好地理解、管理和改善客户的互动过程。今天运营坛…...

数据治理-数据质量-1
为什么要保证数据质量 有效的数据管理涉及一系列复杂的、相互关联的过程,它使组织能够利用他们的数据来实现战略目标。数据管理能力包含各个方面,但最重要的要实现数据价值,而实现数据价值的前提是数据本身是可靠和可信的,换句话说…...

第 3 章 栈和队列 (循环队列)
1. 背景说明 和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外, 尚需附设两个指针 front 和 rear 分别指示队列头元素及队列尾元素的位置。约定:初始化建空队列时&#x…...

boost::any 与 boost::any_cast
在boost库中,boost::any 与 boost::any_cast的使用方法是什么?设计宗旨是什么?他们与模板有什么区别? 在Boost库中,boost::any和boost::any_cast用于处理类型安全的任意类型值的存储和检索。 使用方法: …...

go 、rust、python 语言 编码效率、性能比较
1、 Rust适合内存使用苛刻、无GC、超高性能的场景, 如果是实时计算系统,那rust的吞吐量对于Go还是有一定优势的,基于线程和goroutine的调度模式还是有差别的。能用他的都是高手,代码量大,内存占用不高, 20…...

怎么把pdf转换成高清图片?
怎么把pdf转换成高清图片?最近,我的同事遇到了一个问题,现在她需要将一些pdf文件转换成高清的图片,这件事情让让她感到非常无助,因为她非常着急需要将这些文件转换为图片格式,以便更好的在今后的工作中进行…...

尚硅谷大数据项目《在线教育之离线数仓》笔记006
视频地址:尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第11章 数仓开发之ADS层 P087 P088 P089 P090 P091 P092 P093 P094 P095 P096 P097 P098 P099 P100 P101 P102 P103 P104 P105 P106 P107 P108 P109 P110 P111 …...

企业架构LNMP学习笔记2
企业架构分布式集群最终解决方案 集群:多台服务器在一起做同样的事情。 分布式:多台服务器在一起做不同的事情。 最终架构:实现负载均衡LB,高可用HA,数据库主从复制M-S,读写分离R-W,缓存中间件…...

AI「反腐」,德国马普所结合 NLP 和 DNN 开发抗蚀合金
内容一览:在被不锈钢包围的世界中,我们可能都快忘记了腐蚀的存在。然而,腐蚀存在于生活中的方方面面。无论是锈迹斑斑的钢钉,老化漏液的电线,还是失去光泽的汽车,这一切的发生都与腐蚀有关。据统计…...

9-AJAX-2综合案例
AJAX-综合案例 目录 案例-图书管理图片上传案例-网站换肤案例-个人信息设置 学习目标 今天主要就是练,巩固 axios 的使用 完成案例-图书管理系统(增删改查)经典业务掌握图片上传的思路完成案例-网站换肤并实现图片地址缓存完成案例-个人信…...

力扣:86. 分隔链表(Python3)
题目: 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 来源:力扣(LeetCode)…...

联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!
7 月 24 日,教育部科技发展中心官网发布了《中国高校产学研创新基金-阿依瓦科技创新教育专项申请指南》。 针对高校在人工智能、智能制造、智慧校园、大数据等领域科研和教研的创新研究,教育部高等学校科学研究发展中心与阿依瓦(北京)技术有…...

Ubuntu入门05——磁盘管理与备份压缩
1.检查磁盘空间占用情况 2.统计目录或文件所占磁盘空间大小 3.压缩 3.1 zip、unzip和zipinfo 运行时发现上面命令不成功,换成: (将文件lkw放入压缩文件lkw01.zip中) sudo zip -m lkw01.zip lkw 解压文件: 实操&…...

[github-100天机器学习]day4+5+6 Logistic regression
https://github.com/MLEveryday/100-Days-Of-ML-Code/blob/master/README.md 逻辑回归 逻辑回归用来处理不同的分类问题,这里的目的是预测当前被观察的对象属于哪个组。会给你提供一个离散的二进制输出结果,一个简单例子:判断一个人是否会在…...

【菜鸡学艺–Vue2–001】模板语法声明式渲染
【菜鸡学艺–Vue2–001】模板语法&声明式渲染 🦖我是Sam9029,一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **🐱🐉🐱🐉恭喜你,若此文你认为写…...

LabVIEW开发感应电机在线匝间短路故障诊断系统
LabVIEW开发感应电机在线匝间短路故障诊断系统 工业中使用的超过85%的电动机是三相感应电动机。它们因其可靠性、设计便利性、高性能和过载能力而被广泛用于不同的应用,例如制造、加工、电力系统、运输等。无论它们的能力如何,它们都被认为是现代工业学…...