CentOS 搭建 K8S

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.yamlcontainerPort8000,执行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 举报,一经查实,本站将立刻删除。

相关推荐


linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 安装Supervisor&#160;1 yum install python-setuptools
设置时区(CentOS 7) 先执行命令timedatectl status|grep &#39;Time zone&#39;查看当前时区,如果不是时区(Asia/Shanghai),则需要先设置为中国时区,否则时区不同会存在时差。 #已经是Asia/Shanghai,则无需设置 [root@xia
vim&#160;/etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=&quot;static&quot; ONBOOT=yes IPADDR=192.168.8.106 NETMASK=255.255.252.0 GATEWAY=192.168.
一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [root@localhost local]# yum install -y gcc 二、下载并解压安装包 [root@localhost local
第一步 On CentOS/RHEL 6.*: $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm On CentOS/RHEL 7: $
/// &lt;summary&gt; /// 取小写文件名后缀 /// &lt;/summary&gt; /// &lt;param name=&quot;name&quot;&gt;文件名&lt;/param&gt; /// &lt;returns&gt;返回小写后缀,不带“.”&lt;/ret
which nohup .bash_profile中并source加载 如果没有就安装吧 yum provides */nohup nohup npm run start &amp; nohup ./kibana &amp;
1.1 MySQL安装 1.1.1 下载wget命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装My
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 top 日期 date 设置时间 date 033017002015 #月日时间年 日历 cal
1、firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 :
1 下载并安装MySQL官方的&#160;Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令就直接下载了安装用的Yum Repository,大概
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。 一、相关命令 通过initctl help可以查看相关命令 [root@localhost ~]# initctl help Job commands: start Start job. sto
1、使用命令:df -lk 找到已满磁盘 2、使用命令:du --max-depth=1 -h 查找大文件,删除
ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储位置: /etc/services文件 route:查看路由信息 wget:下载网路文件,例如 wg
ps -ef:查看所有进程,&#160;ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 kill 640,强制杀:kill -9 640 man:查看帮助,例如 man ps 查看
useradd:添加用户 useradd abc,默认添加一个abc组 vipw:查看系统中用户 groupadd:添加组groupadd ccna vigr:查看系统中的组 gpasswd:将用户abc添加到ccna组 gpasswd -a abc ccna groups abc:查看用户abc属