CentOS 搭建 K8S
版本信息
-
linux发行版:CentOS 8.2
-
安装docker-ce 20.10.5(所有机器)
-
设置k8s环境准备条件(所有机器)
-
安装k8s v1.23.0 master管理节点
-
安装k8s v1.23.0 node工作节点
-
安装flannel(master)
安装docker-ce(所有机器)
所有安装k8s的机器都需要安装docker:
# 安装yum源管理工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置阿里云的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce
yum install -y docker-ce
# 启动docker
systemctl enable docker && systemctl start docker
设置k8s环境准备条件(所有机器)
安装k8s的机器需要2个CPU和2g内存以上的配置,执行以下脚本做一些准备操作。所有安装k8s的机器都需要这一步操作。
你可以不关闭防火墙,只需要开启这些端口就行了
MASTER节点
6443* Kubernetes API server
2379-2380 etcd server client API
10250 Kubelet API
10251 kube-scheduler
10252 kube-controller-manager
10255 Read-only Kubelet API (Heapster)
Worker节点
10250 Kubelet API
10255 Read-only Kubelet API (Heapster)
30000-32767 Default port range for NodePort Services. Typically,these ports would need to be exposed to external load-balancers,or other external consumers of the application itself.
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
# 临时禁用交换分区
swapoff -a
# 永久禁用交换分区,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改内核参数(可选)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 修改主机名
hostnamectl set-hostname k8s-master
安装k8s master管理节点
以上两个步骤检查完毕之后,继续以下步骤。由于官方k8s源在google,国内无法访问,这里使用阿里云yum源。
安装kubeadm、kubelet、kubectl
# 执行配置k8s阿里云源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
# 安装kubeadm、kubectl、kubelet
yum install -y kubectl-1.23.0 kubeadm-1.23.0 kubelet-1.23.0
# 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
初始化k8s
以下开始安装k8s需要用到的docker镜像,因为无法访问到国外网站,所以这条命令使用的是国内的阿里云的源(registry.aliyuncs.com/google_containers
)。另一个非常重要的是:这里的--apiserver-advertise-address
使用的是master和node间能互相ping通的ip,可以是内网ip,也可以是外网ip。
内网ip配置命令:
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.23.0 --apiserver-advertise-address 192.168.99.104 --pod-network-cidr=10.244.0.0/16 --token-ttl 0
公网ip配置命令:
# xxx.xx.xxx.xx为master机器的公网ip地址
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.23.0 --apiserver-advertise-address xxx.xx.xxx.xx --pod-network-cidr=10.244.0.0/16
如果中途出现报错,修复之后需要先执行kubeadm reset
,再重新执行。
这条命令执行时会卡在[preflight] You can also perform this action in beforehand using ''kubeadm config images pull
,大概需要2分钟,请耐心等待。上面安装完后,k8s会提示你输入如下命令,复制粘贴过来,执行即可。
mkdir -p HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf HOME/.kube/config
sudo chown (id -u):(id -g) $HOME/.kube/config
记住node加入集群的命令
上面kubeadm init
执行成功后会返回node节点加入集群的命令,等会要在node节点上执行,需要保存下来,如果忘记了,可以使用如下命令获取。
kubeadm token create --print-join-command
至此,安装master节点完毕。可以使用kubectl get nodes
查看一下,此时master处于NotReady状态。
安装k8s node工作节点
如果还没安装docker,请参照本文步骤二安装docker-ce(所有机器)安装。如果没设置k8s环境准备条件,请参照本文步骤三设置k8s环境准备条件(所有机器)执行。
以上两个步骤检查完毕之后,继续以下步骤。
安装kubeadm、kubelet
# 执行配置k8s阿里云源
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=[kubernetes-yum-repos-kubernetes-el7-x86_64安装包下载_开源镜像站-阿里云](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
# 安装kubeadm、kubectl、kubelet
yum install -y kubeadm-1.23.0 kubelet-1.23.0
# 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
加入集群
这里加入集群的命令每个人都不一样,可以登录master节点,使用kubeadm token create --print-join-command
来获取。获取后执行如下。
kubeadm join 192.168.99.104:6443 --token ncfrid.7ap0xiseuf97gikl \
--discovery-token-ca-cert-hash sha256:47783e9851a1a517647f1986225f104e81dbfd8fb256ae55ef6d68ce9334c6a2
加入成功后,可以在master节点上使用kubectl get nodes
命令查看到加入的节点。
如果想要node节点也能够执行kubectl
命令,需要将master的/etc/kubernetes/admin.conf
移到node节点上,同时配置环境变量,同master。
安装flannel(master机器)
以上步骤安装完后,机器搭建起来了,但状态还是NotReady,master机器需要安装flanneld。目前每增加一个node节点,需要重新执行一次这个命令,保证网络通畅。
下载官方fannel配置文件
使用wget
命令,地址为: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安装fannel
kubectl apply -f kube-flannel.yml
注意事项和常见问题
node xxx not found报错
安装到kubeadm init
那一步执行后,出现如:node xxx not found等的报错。
E0519 23:21:51 .331778 25545 kubelet.go:2419] “Error getting node” err=”node \”master\” not found”
-
检查k8s版本是否高于v1.24.0,k8s版本 v1.24.0及以上不支持docker。
-
如果k8s版本符合要求,再检查
kubeadm init
传入的参数是否正确,特别是--apiserver-advertise-address
这个参数。 -
可考虑检查hostname相关配置是否正确。
需要确定主机名配置、hosts中(或DNS)的主机名解析是否匹配,另外还需要确认kubeadm init中IP正确,kubeadm使用配置文件初始化时,也需要核实配置文件中IP和主机名是否正确。
查看当前主机名:
hostname
hostname文件的主机名:
cat etc/hostname
etc/hosts中的主机名和解析记录:
cat etc/hosts
Docker驱动不一致
failed to run Kubelet: misconfiguration: kubelet cgroup driver: “systemd” is different from docker cgroup driver: “cgroupfs”"
这是由于docker的驱动和k8s的驱动不一致导致的,解决方式: 替换docker的cgroup为systemd。
# /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl restart docker
如果未能解决问题,需要再修改kubelet的Cgroup Driver
修改/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
文件,增加(或修改成)--cgroup-driver=systemd
(官方推荐用systemd)
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=systemd"
修改 /var/lib/kubelet/kubeadm-flags.env
文件,增加(或修改成)--cgroup-driver=systemd
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2"
如果是原来正常运行的集群出现这个错误导致集群运行出现异常,修改完以上配置后,需要重启kubelet
systemctl daemon-reload
systemctl restart kubelet
执行过程健康监测状态超时
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory “/etc/kubernetes/manifests”. This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
解决方式:另开一个终端,打开/etc/kubernetes/manifests/etcd.yaml
,需要把--listen-client-urls
和--listen-peer-urls
都改成127.0.0.1:2379和127.0.0.1:2380。执行systemctl restart kubelet
。
连接到8080端口失败
The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 执行如下命令(非root用户):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u):(id−u):(id -g) $HOME/.kube/config
# 执行命令(root用户):
export KUBECONFIG=/etc/kubernetes/admin.conf
resolv.conf找不到
Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
将master上对应目录/run/systemd/resolve/resolv.conf文件复制一份到子节点上即可。
如还不行,可试下如下方法:
1、首先kubectl -n kube-system edit configmap coredns
2、然后注释掉loop
3、最后kubectl -n kube-system delete pod -l k8s-app=kube-dns
no route to host
问题描述: 搭建rocketmq集群时,在机器2上 ping 机器1的ip地址可以ping通,但telnet指定端口(9876)时提示 no route to host。
防火墙问题
在机器1运行systemctl status firewalld
,发现状态是inactive,没有启动,排除防火墙问题
iptable配置问题
方法a: 清除所有iptables(慎用,可能影响配置)
iptables -F
方法b: 端口放行
# 查看已配置的规则
iptables-save
# 放开端口
iptables -I INPUT -p tcp -m tcp --dport 9876 -j ACCEPT
iptables-save
# 出现COMMIT则提交成功
Docker与k8s版本匹配
不同版本的k8s需要对应不同版本的docker版本,如果想安装不同版本的k8s可以自行搜一下对应的Docker版本。
节点NOT READY网络未配置
Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Unable to update cni config: no networks found in /etc/cni/net.d
解决方案1
就遇到的情况给出解决方法,基于v1.21.1版本,已安装weave,发现仍有以上错误。
发现 /opt/cni/bin
目录下缺少很多可执行文件,处理方式是重新安装kubernetes-cni
yum install -y kubernetes-cni
重新初始化问题节点即可。
解决方案2
看到有的博主使用单节点k8s,不想看NOT READY状态,把 /var/lib/kubelet/kubeadm-flags.env
或 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
下的 --network-plugin=cni
给去掉了。
kubelet配置 --network-plugin=cni
,仅当CNI(容器网络插件)正确安装后才会改变状态为 READY。
上文出现的情况原因就是缺少CNI可执行文件,导致CNI初始化失败。
解决方案3
将master上/etc/cni/net.d
目录下的文件拷贝到有问题的节点上:scp server4:/etc/cni/net.d/* /etc/cni/net.d/
创建完pod后报错: Failed connect to 10.244.36.90:8000; No route to host
deployment.yaml
的containerPort
为8000
,执行curl命令时提示找不到路由。执行:
iptables --flush
iptables -tnat --flush
k8s network: stat /var/lib/calico/nodename: no such file or directory
是calico配置残留的问题,然后找到相关的calico 文件删除掉问题就解决了。
需要删除 /var/lib/calico
这个目录 和/etc/cni/net.d/
这个目录下的calico文件就行了 。
另外还有个问题就是calico/node is not ready: BIRD is not ready: BGP not established
这个问题在换成flannel后就没有了,而且之前部署的数据库也能正常访问了。
ImagePullBackOff 错误
docker镜像源无法访问,检查一下网络是否是通的。调试好后,输入以下命令强制刷新即可。
systemctl daemon-reload
systemctl restart docker
Master当作Node使用的方法
使用下面的命令操作使得master可以作为node使用,承载pod
kubectl taint nodes --all node-role.kubernetes.io/master-
可能会出现下面的结果,因为taint(master标记的污点已经被去掉了)没有关系
taint "node-role.kubernetes.io/master" not found
taint "node-role.kubernetes.io/master" not found
可以用下面的
kubectl describe nodes master1 |grep Taint
命令确认一下taint已经没有了:Taints: <none>
创建应用时的--replicas
参数改大一些,这样才会很明显的看到pod分配到master和node节点了。注:如果想只起两个副本且必须分配到两个机器上 请参考nodeSelector以及亲和性和反亲和性的的用法。
无法删除状态为terminating的pod
每当删除namespace或pod 等一些Kubernetes资源时,有时资源状态会卡在terminating,很长时间无法删除,甚至有时增加–force flag(强制删除)之后还是无法正常删除。这时就需要edit该资源,将字段finalizers设置为null,之后Kubernetes资源就正常删除了。
当删除pod时有时会卡住,pod状态变为terminating,无法删除pod
(1) 强制删除
kubectl delete pod xxx -n xxx --force --grace-period=0
(2) 如果强制删除还不行,设置finalizers为空
kubectl patch pod xxx -n xxx -p ‘{“metadata”:{“finalizers”:null}}’
这样pod就可以删除了。
常用的命令
# 查看端口占用情况
netstat -anp | grep 8080
# 查看服务运行日志
journalctl -xeu kubelet
# 新建命名空间
kubectl create ns dev
# 查询全部 pod(所有命名空间)
kubectl get pods --all-namespaces
# 查询全部 pod(指定命名空间)
kubectl get pods -n
# 查询全部 node 节点
kubectl get nodes
# 查看 pod 详细信息和日志
kubectl describe pod -n
kubectl logs -f -n
# 查看 pod-yaml 文件
kubectl get pod -n -o yaml
# 通过标签查询 pod
kubectl get pod -l app= -n
# 查询 pod 具体某一条信息
kubectl -n get pods|grep |awk '{print $3}'
# 删除 pod(或通过标签 -l app=)
kubectl delete pod -n
# 删除 deployment
kubectl delete deployment -n
# 强制删除 pod
kubectl delete pod -n --force --grace-period=0
# 批量删除 pod
kubectl get pods -n ${namespace} | grep ${status} | awk '{print $1}' | xargs kubectl delete pod -n dev --force --grace-period=0
kubectl get pods -n yhdsp-dev | grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n yhdsp-dev --force --grace-period=0
# 进入 pod 容器
kubectl exec -it podname -c containername -n namespace /bin/bash
# 给 node 打标签
kubectl label node <node_name> key=value # 给节点打标签
# 查看某一个 node 标签
kubectl get node -l ""
# 查看全部 node 标签
kubectl get node --show-labels=true
原文地址:https://blog.csdn.net/tyq9702/article/details/136052025
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。