K8S在centeros中的部署

编程入门 行业动态 更新时间:2024-10-15 18:30:40

参考文章:Kubernetes(K8S) 1.23.6版本基于Docker的集群安装部署

其他参考:Kubernetes集群环境的搭建

一、前言:

01、如安装过程中出错,可以把整个K8S删除掉,命令如下:

yum list installed|grep kube
yum -y remove cri-tools.x86_64 kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 kubernetes-cni.x86_64

02、删除已安装的docker可以使用命令如下:

注意安装ce版本,所以这里Docker安装20.10.7版本,containerd安装1.4.6版本

yum list installed|grep docker
yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce-rootless-extras.x86_64 docker-scan-plugin.x86_64

二、正式开始部署:

 00、准备3台centeros机器,每台机器上都安装docker,此处略过。参考安装docker ce版本

参考地址:centos7基于yum repository方式安装docker和卸载docker

已安装docker低于1.13版本的docker需要修改如下:

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors":["https://dhjv7df4.mirror.aliyuncs","https://23ah010p.mirror.aliyuncs"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

并重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

 01、准备3台centeros机器,并分别设置hostname:

hostnamectl set-hostname k8smaster
hostnamectl set-hostname k8snode1
hostnamectl set-hostname k8snode2

02、查看3台机器的ip,3台机器上都配置hosts文件,因k8s是依据hostname进行通信的。

cat >> /etc/hosts << EOF        
192.168.3.48 k8smaster
192.168.3.50 k8snode1
192.168.3.49 k8snode2
EOF

03、每台机器上关闭防火墙并禁止使用swap交换,拷贝出来逐条执行

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
swapoff -a                         #关闭swap交换分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab      #禁止swap交换分区开机自启

#合一为:
#systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

04、网桥设置

04-1 为了让服务器的iptables能发现bridged traffic,需要添加网桥过滤和地址转发功能

增加了一个bre_netfilter的网桥?

cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

04-2 每台机器上将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system                        #使上一条命令的配置生效

 04-3 加载br_netfilter网桥过滤模块,和加载网络虚拟化技术模块

modprobe br_netfilter
modprobe overlay

检验网桥过滤模块是否加载成功

[root@k8s-master ~]# lsmod | grep -e br_netfilter -e overlay
br_netfilter           22256  0 
bridge                151336  1 br_netfilter
overlay                91659  0 
[root@k8s-master ~]#

04-04  配置IPVS

service有基于iptables和基于ipvs两种代理模型。基于ipvs的性能要高一些。需要手动载入才能使用ipvs模块

安装ipset和ipvsadm

yum install ipset ipvsadm
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
 
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 添加执行权限给脚本文件,然后执行脚本文件

chmod +x /etc/sysconfig/modules/ipvs.modules

/bin/bash /etc/sysconfig/modules/ipvs.modules

# 检验模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4      15053  2 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_conntrack          139264  7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrac

05、每台机器上NTP时间同步,使得所有节点的时间一致

yum install -y ntpdate        #安装ntpdate用于校准时间,确保master和node时间同步
ntpdate time.windows    #校准时间

06、每台机器上安装kubnets,以下命令逐条拷贝

06-1 每台机器上执行

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun/kubernetes/yum/doc/rpm-package-key.gpg
EOF


setenforce 0

yum install -y --setopt=obsoletes=0 --nogpgcheck kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6

#为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改改"/etc/sysconfig/kubelet"文件的内容:

vim /etc/sysconfig/kubelet

# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"



systemctl enable kubelet --now

ps1:由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装

ps2:执行setenforce 0 报告 setenforce: SELinux is disabled

vi /etc/selinux/config

更改为:SELINUX=1,并重启电脑

查看是否安装成功,说明如下:

obsoletes等于1表示更新旧的rpm包的同时会删除旧包,0表示更新旧的rpm包不会删除旧包
kubelet启动后,可以用命令journalctl -f -u kubelet查看kubelet更详细的日志
kubelet默认使用systemd作为cgroup driver
启动后,kubelet现在每隔几秒就会重启,因为它陷入了一个等待kubeadm指令的死循环

06-2  执行安装镜像

[root@k8smaster yum.repos.d]# kubeadm config images list
I0716 12:41:12.720967    9862 version.go:255] remote version is much newer: v1.24.3; falling back to: stable-1.23
k8s.gcr.io/kube-apiserver:v1.23.17
k8s.gcr.io/kube-controller-manager:v1.23.17
k8s.gcr.io/kube-scheduler:v1.23.17
k8s.gcr.io/kube-proxy:v1.23.17
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

将执行结果拷贝到image.sh文件中,然后分别在各机器上执行该脚本

master机器上包括以上所有,node节点上只包括kube-proxy和pause

master机器上脚本为

tee ./images.sh <<'EOF'
#!/bin/bash

images=(
kube-apiserver:v1.23.17
kube-controller-manager:v1.23.17
kube-scheduler:v1.23.17
kube-proxy:v1.23.17
pause:3.6
etcd:3.5.1-0
coredns:v1.8.6
)
for imageName in ${images[@]} ; do
docker pull registry-hangzhou.aliyuncs/google_containers/$imageName
done
EOF

chmod +x ./images.sh && ./images.sh

node机器脚本为

tee ./images.sh <<'EOF'
#!/bin/bash

images=(
kube-proxy:v1.23.17
pause:3.6
)
for imageName in ${images[@]} ; do
docker pull registry-hangzhou.aliyuncs/google_containers/$imageName
done
EOF

chmod +x ./images.sh && ./images.sh

07、仅在master机器上执行,下面的ip替换为master的ip,务必阅读ps部分,需要拿输出的日志到nodes上执行

kubeadm init \
--apiserver-advertise-address=192.168.10.200 \
--control-plane-endpoint=k8smaster \
--image-repository registry-hangzhou.aliyuncs/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=NumCPU

PS1:可能会报告 [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2,是因为k8s至少在2核机器上运行,可以在命令最后增加 --ignore-preflight-errors=NumCPU

PS2:本命令执行完毕后,会在最后输出如下日志,提示在node节点上执行,必须要先记录下来以备后用:kubeadm join k8smaster:6443 --token ifhd1n.k8h6ikhb3sybeq7d \
        --discovery-token-ca-cert-hash sha256:4f9baaa9bcc02735ab6f2cfaa670f5a7457016e7c82f0af3da92af0d3b73aa20

kubeadm join k8smaster:6443 --token 2o91aa.l2l560a1ymarxodn \
        --discovery-token-ca-cert-hash sha256:307494813bfb489735f747d769177617ccab60a76c24a677d0f713f464d035bd

P3:启动占用的6443端口,可以通过kubectl cluster-info查看到

P4:如果init失败,可以通过如下方式回退

kubeadm reset -f

rm -rf /etc/kubernetes
rm -rf /var/lib/etcd/
rm -rf $HOME/.kube

08、仅在master机器上依据上面执行结果提示,需要先依次执行:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

09、仅在master机器上,安装flannel网络插件(亲测)或calico插件,目的是为kubernetes的机器提供一个子网.

或将该文件下载下来后,上传到$HOME/.kube目录下。

cd $HOME/.kube
wget https://gitee/mirrors/flannel/blob/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

PS1:安装完毕后可以通过 kubectl get pods -n kube-system|grep flannel 命令查看是否部署

10、查看健康状况,大概需要等N分钟会显示全部running,包括coredns

kubectl get pods -n kube-system

# 查看健康状态
kubectl get  cs

#可能需要10分钟左右启动初始化完成,才有返回结果.然后再执行下一步
ps -ef|grep flannel|grep -v grep

#可能需要等待十几分钟,状态才能全部转为ready.然后再执行下一步
kubectl get nodes

 11、在其他nodes 机器上执行,将另外2个子节点加入到master上管理,该命令来自master节点初始化的输出

kubeadm join k8smaster:6443 --token 2o91aa.l2l560a1ymarxodn \
        --discovery-token-ca-cert-hash sha256:307494813bfb489735f747d769177617ccab60a76c24a677d0f713f464d035bd

如果不能加入可以重置后,继续敲上面的加入命令

systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl restart docker
systemctl start kubelet
kubeadm reset

PS1:在master机器上执行kubectl get nodes,大概需要等N分钟(8分钟左右)会出现加入的节点ready。

PS2:如果后期有node想加入,但是又不知道token,可以在master节点下操作生成一个新的token后依据提示加入集群:

kubeadm token create --print-join-command

三、安装K8S管理界面(K8S版本1.23.6)

Kubernetes官方可视化界面:https://github/kubernetes/dashboard

参考文章:helm安装kubernetes-dashboard(2.5.1)

官方地址:

 https://raw.githubusercontent/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml

国内下载dashboard安装文件,请连接这里

02、执行命令

kubectl apply -f $HOME/.kube/kubernetes-dashboard.yaml

然后执行watch -n 3 kubectl get pods -A ,可以每3秒查看下pods状态,大概需要2分钟,可以看到dashboard及metrics被创建。

04、执行以下命令进入修改,将type: ClusterIP改为:type: NodePort

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

05、查看端口命令

kubectl get svc -A | grep kubernetes-dashboard

可以看到:dashboard的访问端口是30843.

因此访问192.168.3.48:30843就可访问到dashboard,注意必须使用https协议来访问。

https://192.168.3.48:30843/

chrome浏览器可能会提示"您的连接不是私密连接",此时可以在当前页面,不在地址栏,而是在键盘上直接输入thisisunsafe   此时页面会自动刷新进入。

[root@k8smaster .kube]# kubectl get svc -A | grep kubernetes-dashboard
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.230.116   <none>        8000/TCP                 7m47s
kubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.75.51     <none>        443:30843/TCP            7m48s

进入后,需要输入管理员账号。

03、配置管理员账号

03-1 在master节点上创建访问账号

tee $HOME/.kube/dash.yaml <<'EOF'
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF


kubectl apply -f $HOME/.kube/dash.yaml

执行成功后可以看到

serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

执行如下命令获取访问令牌

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

将令牌拷贝到访问页面即可进入k8s控制台。

04、进入控制台后, 同token 默认15分钟失效,修改为90天失效

在  deployments下找到dashborad,编辑增加,数字是秒为单位

- '--token-ttl=7776000'

05、 k8s拉取私有镜像需要在master节点产生密钥,并且在运行应用的使用使用密钥。执行如下命令在haiju-dev命名空间下创建了一个名字为docker-registry的密钥

kubectl create secret docker-registry haiju-docker \
    --docker-server=registry-hangzhou.aliyuncs \
    --docker-username='XXX@qq' \
    --docker-password='XXXX' \
    -n haiju-dev

官方例子

kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

四、修改k8s部署端口范围

k8s总的nodeport方式端口默认为30000-32767。参考文章在 master节点上修改

vim /etc/kubernetes/manifests/kube-apiserver.yaml

#找到 --service-cluster-ip-range 这一行,在这一行的下一行增加 如下内容
- --service-node-port-range=1-65535

#最后重启下k8s服务
systemctl daemon-reload
systemctl restart kubelet

五、常见K8S命令

 kubectl version

kubectl help

systemctl stop kubelet  停止服务

systemctl start kubelet  启动服务

kubectl get deploy  # 查看部署了哪些容器

kubectl top node 查看node的cpu/内存情况

kubectl top pod 查看pod的资源使用情况

kubectl get all --all-namespaces -o wide   查看所有的部署容器

 kubectl logs -f  coredns-65c54cc984-25m2m  -n kube-system  查看某个容器的日志

 kubectl get pod -o wide  查看所有的pod,可以看到部署在哪些机器上

允许master节点部署pod
kubectl taint nodes --all node-role.kubernetes.io/master-
如果不允许调度
kubectl taint nodes 这里写node-name node-role.kubernetes.io/master=:NoSchedule
污点可选参数
	  NoSchedule: 一定不能被调度
      PreferNoSchedule: 尽量不要调度
      NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

将已经安装的pod产生yml文件

# 找到安装的pod
kubectl get deploy -A

#生成yaml文件
 kubectl get deploy kubernetes-dashboard -o yaml -n kubernetes-dashboard > 88.yaml

port: 暴露在cluster ip上的端口,port提供了集群内部客户端访问service的入口,即clusterIP:port

nodePort:nodePort 提供了集群外部客户端访问 Service 的一种方式,nodePort 提供了集群外部客户端访问 Service 的端口,通过 nodeIP:nodePort 提供了外部流量访问k8s集群中service的入口。

targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

containerPort :pod内部容器的端口,targetPort映射到containerPort

流量走向

port/nodePort-----流量---->targetPort-----流量---->containerPort

镜像拉取策略 imagePullPolicy:   IfNotPresent   Always  Never

1、查看有哪些节点

kubectl get nodes

1、查看命名空间下的所有服务

kubectl get pods -n kube-system -o wide

查看某个命名空间下的

kubectl get pods -n kube-system|grep flannel

2、查看所有pod的详细信息

kubectl get pod -o wide

2、查看安装了容器

kubectl get pods,svc

或者  kubectl get pod

3、删除某个服务 

kubectl delete service kubernetes-dashboard --namespace=kube-system

4、安装nginx应用

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

5、查看所有的命名空间

kubectl get namespace

6、使用三大检查命令:

kubectl cluster-info
 
kubectl get nodes
 
kubectl describe node

更多推荐

K8S在centeros中的部署

本文发布于:2023-06-14 08:22:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1455767.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:K8S   centeros

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!