kubeadm安装k8s高可用集群1.24.4 centos7.8

9527com / 2024-03-20 / 原文

kubeadm安装k8s高可用集群1.24.4 centos7.8

实验机器准备

部署k8s集群的几点按照用途可以划分为2类角色:

1、master:集群的master节点,集群的初始化节点,最低配置不低于4C8g

2、slave:集群的slave节点,可以是多台,最低配置不低于4C4g

3、主机都配置静态ip

centos7.8高可用架构图

主机名 ip 配置
docker-harbor 10.20.220.230 4c4g
k8s-master01 10.20.220.231 4c4g
k8s-master02 10.20.220.232 4c4g
k8s-master03 10.20.220.233 4c4g
k8s-node01 10.20.220.234 4c4g
k8s-node02 10.20.220.235 4c4g
lb01 10.20.220.236 2c2g
lb02 10.20.220.237 2c2g
VIP 10.20.220.238
nfs 10.20.220.239 2c2g
rancher 10.20.220.66 4c4g
本次实验在centos7.8系统部署,
#主机信息、节点IP、部署组件
k8s-master01  10.20.220.231 etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm, kubelet, kube-proxy, 

k8s-master002  10.20.220.232 etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm, kubelet, kube-proxy,
k8s-master03  10.20.220.233 etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm, kubelet, kube-proxy,
k8s-node1   10.20.220.234  kubectl, kubelet, kube-proxy, 
k8s-node2   10.20.220.235 kubectl, kubelet, kube-proxy,

设置代理上网

export https_proxy=http://10.20.201.18:8080
export http_proxy=http://10.20.201.18:8080

1 系统优化

1.1 修改静态ip

#修改登录慢DNS
sudo sed -i '/^UseDNS/ {h; s/.*//; x;}; ${x;/^$/ {s//UseDNS no/;H;}; x;}' /etc/ssh/sshd_config
sudo sed -i '/^GSSAPIAuthentication/ {h; s/.*//; x;}; ${x;/^$/ {s//GSSAPIAuthentication no/;H;}; x;}' /etc/ssh/sshd_config

systemc	restart sshd 



cp  /etc/sysconfig/network-scripts/ifcfg-ens33  /etc/sysconfig/network-scripts/ifcfg-ens33.bak
 


cat >/etc/sysconfig/network-scripts/ifcfg-ens33   <<EOF
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=10.20.220.241
NETMASK=255.255.255.0
GATEWAY=10.220.20.1
DNS1=223.5.5.5
DNS2=114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
#IPV6INIT=yes
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
#UUID=2c899347-7114-455d-b0a9-e9446ef8d6bc
DEVICE=ens33
ONBOOT=yes

EOF
 
 #更新网卡
 systemctl restart network

1.2 修改为命令行界面

systemctl set-default multi-user.target #修改为命令行

1.3 修改默认yum源

cd /etc/yum.repos.d/
mkdir old
mv CentOS-* old
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

1.4 修改主机名

hostnamectl set-hostname docker-hub
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-master02
hostnamectl set-hostname k8s-master03
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
hostnamectl set-hostname lb01
hostnamectl set-hostname lb02


bash

1.5 hosts解析


cat  >/etc/hosts <<'EOF'
 10.20.220.231 k8s-master01 
 10.20.220.232 k8s-master02
 10.20.220.233 k8s-master03
 10.20.220.234  k8s-node01
 10.20.220.235  k8s-node02
EOF



ping -c 2 k8s-master01 
ping -c 2 k8s-master02
ping -c 2 k8s-master03
ping -c 2 k8s-node01
ping -c 2 k8s-node02

1.6 设置iptables、selinux

systemctl stop firewalld  && systemctl disable firewalld 

sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
getenforce 0

如果生产机器,防火墙开启,不能关,也可以,

但是要放行一些端口:

6443:Kubernetes API Server

2379、2380:etcd 服务

10250、10255:kubelet 服务

10257:kube-controller-manager 服务

10259:kube-scheduler 服务

30000-32767:在物理机映射的 NodePort 端口

179、473、4789、9099:Calico 服务端口

如何在防火墙规则里放行端口: firewall-cmd --zone=public --add-port=6443/tcp --permanent #--zone 指定了防火墙规则所属的区域,--add-port 指定了要开放的端口号和协议,-- permanent 表示在重启后也会保留这个规则。

1.7 关闭swap

swapoff -a
#关闭开机启动
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.8 设置时间同步

yum install chrony -y
sed -i.bak "s@server@#server@g" /etc/chrony.conf 
sed -i "6aserver ntp.aliyun.com iburst" /etc/chrony.conf 
systemctl enable chronyd --now  && systemctl status chronyd 
#查看同步状态,前面 ^*开头表示同步正常
[root@rocky_docker ~]# chronyc sources -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6   137    34   +377us[+5935us] +/-   20ms

#写个定时任务
echo '* * * * * /usr/bin/systemctl restart chronyd' >> /etc/crontab

systemctl status crond.service 
systemctl restart crond.service

在 Kubernetes 集群中,各个组件之间的通信和协调都需要依赖时间的同步,如果集群中各节点时 间不一致,可能会导致各种奇怪的问题,例如节点之间无法进行正确的 TLS 握手等。因此,建议在安装 Kubernetes 集群之前,将集群中各个节点的时间同步到相同的时间源,保持时间的一致性。

1.9 修改内核参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

​ modprobe 是一个 Linux 命令,它用于动态地加载内核模块到 Linux 内核中。br_netfilter 是 Linux 内核模块之一,它提供了桥接网络设备和 Netfilter 之间的接口。Netfilter 是 Linux 内核中的一 个框架,它可以在数据包通过网络协议栈时进行修改或过滤。 在 Kubernetes 中,br_netfilter 模块用于实现 Kubernetes 集群中的网络功能。通过加载 br_netfilter 模块,我们可以确保在 Kubernetes 集群中使用的 iptables 规则正确应用。

1)net.bridge.bridge-nf-call-ip6tables: 当数据包经过网桥时,是否需要将 IPv6 数据包传递给 iptables 进行处理。将其设置为 1 表示启用。

2)net.bridge.bridge-nf-call-iptables: 当数据包经过网桥时,是否需要将 IPv4 数据包传递给 iptables 进行处理。将其设置为 1 表示启用。

3)net.ipv4.ip_forward: 是否允许主机转发网络包。将其设置为 1 表示启用。 这些参数是为了让 Linux 系统的网络功能可以更好地支持 Kubernetes 的网络组件(如 flannel、Calico 等),启用这些参数可以确保集群中的 Pod 能够正常通信和访问外部网络。

1.10 挂载nfs

apt install nfs-common -y
mkdir /share/
echo "192.168.199.119:/volume1/test /share nfs defaults        0 0" >>/etc/fstab
mount -a 
df -h

2 部署 keepalived 和 HAproxy

yum  install keepalived haproxy psmisc -y

2.1 配置 HAProxy

在 IP 为 10.20.220.236 与 10.20.220.237 的服务器上按如下参数配置 HAProxy (两台 lb 机器配置一致即可,注意后端服务地址)。

root@lb02:~#   yum install vim -y 
root@lb02:~# cat /etc/haproxy/haproxy.cfg

cat > /etc/haproxy/haproxy.cfg <<EOF
# HAProxy Configure /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    log                     global
    option                  httplog
    option                  dontlognull
    timeout connect         5000
    timeout client          5000
    timeout server          5000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  kube-apiserver
    bind *:6443
    mode tcp
    option tcplog
    default_backend kube-apiserver
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kube-apiserver
    mode tcp
    option tcplog
    balance     roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server kube-apiserver-1 10.20.220.231:6443 check
    server kube-apiserver-2 10.20.220.232:6443 check
    server kube-apiserver-3 10.20.220.233:6443 check

EOF

启动之前检查语法是否有问题

 haproxy -f /etc/haproxy/haproxy.cfg -c
 
systemctl enable haproxy --now && 


image-20240315123617796

停止 Haproxy

 systemctl stop haproxy.service 

2.2 配置 Keepalived

主 HAProxy lb-01 -10.20.220.236 (/etc/keepalived/keepalived.conf)

cat  > /etc/keepalived/keepalived.conf <<EOF
global_defs {
notification_email {
}
smtp_connect_timeout 30    #连接超时时间
router_id LVS_DEVEL01 ##相当于给这个服务器起个昵称
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 20
}
vrrp_instance haproxy-vip {
state MASTER  #主服务器 是MASTER
priority 100  #主服务器优先级要比备服务器高
interface ens33                        #实例绑定的网卡
virtual_router_id 60 #定义一个热备组,可以认为这是60号热备组
advert_int 1 #1秒互相通告一次,检查对方通讯
authentication {
  auth_type PASS
  auth_pass 1111 
}
unicast_src_ip 10.20.220.236      #当前机器地址
unicast_peer {
  10.20.220.237                       #peer中其它机器地址
}
virtual_ipaddress {
  #vip地址
  10.20.220.238/24
}
track_script {
  chk_haproxy
}
}
EOF

备主机 HAProxy lb-1-10.20.220.237 (/etc/keepalived/keepalived.conf)

cat  > /etc/keepalived/keepalived.conf <<EOF
global_defs {
notification_email {
}
router_id LVS_DEVEL02 ##相当于给这个服务器起个昵称
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 20
}
vrrp_instance haproxy-vip {
state BACKUP #备份服务器 是 backup
priority 90 #优先级要低(把备份的90修改为100)
interface ens33                        #实例绑定的网卡
virtual_router_id 60
advert_int 1
authentication {
  auth_type PASS
  auth_pass 1111
}
unicast_src_ip 10.20.220.237      #当前机器地址
unicast_peer {
  10.20.220.236                         #peer 中其它机器地址
}
virtual_ipaddress {
  #加/24
  10.20.220.238/24
}
track_script {
  chk_haproxy
}
}
EOF

image-202403151239265856

2.2.1 启动服务

systemctl restart haproxy 
systemctl restart keepalived && systemctl enable keepalived &&systemctl status keepalived


image-2024031512401766012

image-202403151240534922

2.2.2 测试VIP负载

image-202403151248172471

image-202403151249399112

3 安装k8s

本次实验采用kubeadm安装k8s集群

kubeadm 是 Kubernetes 主推的部署工具之一,将k8s的组件打包为了镜像,然后通过kubeadm进行集群初始化创建。

3.1 设置yum源安装containerd(每台机器都操作)

#配置docker源地址
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#可以把docker安装上,用于做镜像
yum install docker-ce-20.10.18 -y

[root@k8s-master ~]# mkdir -p /etc/docker

[root@k8s-master ~]# cat /etc/docker/daemon.json
cat >  /etc/docker/daemon.json <<EOF
{                     
  "registry-mirrors" : [
    "https://8xpk5wnt.mirror.aliyuncs.com"
  ]
}
EOF
[root@k8s-master ~]# systemctl daemon-reload &&systemctl enable docker && systemctl start docker


#安装containerd.io,
yum list available | grep  containerd.io #查看软件有哪些版本可能查不到1.6.22版本,执行命令直接安装就行

yum install containerd.io-1.6.22 -y  #安装指定版本的

mkdir -p /etc/containerd
cd /etc/containerd/
containerd config default > /etc/containerd/config.toml 
grep sandbox_image  /etc/containerd/config.toml

#替换为阿里源
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml

sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml


配置containerd cgroup 驱动程序systemd:
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml



##containerd加速

# 修改配置文件/etc/containerd/config.toml, 145行添加config_path
...
    144     [plugins."io.containerd.grpc.v1.cri".registry]
    145       config_path = "/etc/containerd/certs.d"
    146
    147       [plugins."io.containerd.grpc.v1.cri".registry.auths]
    148
    149       [plugins."io.containerd.grpc.v1.cri".registry.configs]
    150
    151       [plugins."io.containerd.grpc.v1.cri".registry.headers]
    152
    153       [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
...

# 创建对应的目录
mkdir -p /etc/containerd/certs.d/docker.io

# 配置加速
# 和你配置多个docker镜像加速源一个意思
cat >/etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"
[host."https://ms9glx6x.mirror.aliyuncs.com"]
  capabilities = ["pull","resolve"]
[host."https://docker.mirrors.ustc.edu.cn"]
  capabilities = ["pull","resolve"]
[host."https://registry-1.docker.io"]
  capabilities = ["pull","resolve","push"]
EOF


#重启服务
systemctl restart containerd.service    && systemctl enable containerd.service && systemctl status containerd.service 

在 Kubernetes 集群中,containerd 是容器运行时,它的主要作用是负责管理节点上的容器,实 现容器的创建、销毁、运行、暂停、恢复等操作。而 Pod 是 Kubernetes 中最基本的调度单元,一个 Pod 包含一个或多个紧密关联的容器,在 Kubernetes 集群中,当一个 Pod 被调度到一个节点上时, Kubernetes 就会基于 containerd 在 pod 里运行容器。

3.1.1 配置非安全http的私有镜像仓库们这里先不用设置

# 如果要和docker一样,再加一个registry私有仓库的配置如下

# 此处目录必须和个人环境中实际的仓库地址保持一致

mkdir -p /etc/containerd/certs.d/10.20.220.230
cat >/etc/containerd/certs.d/10.20.220.230/hosts.toml <<EOF
server = "http://10.20.220.230"
[host."http://10.20.220.230"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true
EOF

3.2 设置apt源安装k8s源,所有节点

# docker制作的镜像,和containerd,k8s都是通用的
# 和containerd没有向docker一样方便的工具,管理image等,所以还是用docker维护容器居多

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



3.3 安装kubeadm工具,所有节点执行

操作节点: 所有的master和slave节点(k8s-master,k8s-slave) 需要执行

这里采用1.24.10版本

安装方式很多,官网推荐以及CKA也都是走kubeadm安装,二进制方式,还可以借助第三方平:rancher、kubesphere 都可以装 k8s.

# --disableexcludes=kubernetes 作用是允许该k8s仓库的一些包的更新
$ yum install -y kubelet-1.24.4 kubeadm-1.24.4 kubectl-1.24.4 --disableexcludes=kubernetes

## 查看kubeadm 版本
$ kubeadm version

#设置开机启动
systemctl enable kubelet &&systemctl restart kubelet  && systemctl status kubelet 

image-202403151354141462

注:每个软件包的作用

kubelet: kubelet 是 Kubernetes 集群中的一个核心组件,是每个节点上的代理服务,负责与主 控制节点通信,管理节点上的 Pod 和容器。

kubelet 的主要职责包括:

监控 pod 的状态并按需启动或停止容器、检查容器是否正常运行、与主控制节点通信,将节点状态 和 Pod 状态上报给主控制节点、通过各种插件(如 volume 插件)与其他组件协同工作、管理容器的生 命周期,包括启动、停止、重启等、拉取镜像

kubeadm:用于初始化 k8s 集群的命令行工具

kubectl: 用于和集群通信的命令行,通过 kubectl 可以部署和管理应用,查看各种资源,创建、 删除和更新各种组件

3.4 初始化集群,先在master01节点执行

备注:安装 k8s,物理机网段、pod 网段、service 网段不能冲突

 kubeadm config print init-defaults > kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
  #localAPIEndpoint:
  # advertiseAddress: 1.2.3.4
  #bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
    # name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改国内地址
kind: ClusterConfiguration
kubernetesVersion: 1.24.4
controlPlaneEndpoint: 10.20.220.238:6443   #新增
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16   #新增
scheduler: {}

特别提醒:

1、 nodeRegistration: criSocket:

unix:///var/run/containerd/containerd.sock nodeRegistration 是在 Kubernetes 集群中注册节点的一种方式。在这个配置中,criSocket 表 示与此节点相关的容器运行时的地址,此处指的是使用 Containerd 作为容器运行时。

2、--image-repository :registry.cn-hangzhou.aliyuncs.com/google_containers 表示从 阿里云镜像仓库的的名为"google_containers"的命名空间中拉取容器镜像,因为 kubeadm 安装 k8s,控制节点的组件基于 pod 运行,所以需要镜像,默认的镜像仓库国内无法访问,所以需要指定阿 里云镜像仓库,也可以把安装 k8s1.26 需要的镜像用 ctr -n=k8s.io images import 解压,这样就可 以直接在本地找镜像了。

3、podSubnet: 10.244.0.0/12 #指定 pod 网段 serviceSubnet: 10.96.0.0/12 #指定 Service 网段 在 k8s 集群中,pod 网段,service 网络,物理机网段不能冲突。

image-202403161247281874

Kubeadm 安装 k8s,控制节点和工作节点的组件都是基于 pod 运行的,控制节点组件: apiserver、scheduler、controller-manager、etcd、容器、kubelet、kube-proxy、calico

工作节点:flannel、容器运行时、kube-proxy、coredns、kubelet

3.5 基于kubeadm.yaml文件初始化k8s,

3.5.1 在线方法,只有master01节点执行

# 查看需要使用的镜像列表,若无问题,将得到如下列表
[root@k8s-master01 ~]# kubeadm config images list --config kubeadm.yaml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4
registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4
registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4
registry.aliyuncs.com/google_containers/pause:3.7
registry.aliyuncs.com/google_containers/etcd:3.5.3-0
registry.aliyuncs.com/google_containers/coredns:v1.8.6





[root@k8s-master01 ~]#  kubeadm config images pull --config kubeadm.yaml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.7
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.3-0
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.8.6


把下载的镜像打包

#查看镜像
ctr -n=k8s.io images list
#把所有镜像打包成一个压缩包
ctr -n=k8s.io images export k8s.1.24.4  registry.aliyuncs.com/google_containers/kube-apiserver:v1.24.4 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.24.4  registry.aliyuncs.com/google_containers/kube-scheduler:v1.24.4 registry.aliyuncs.com/google_containers/kube-proxy:v1.24.4 registry.aliyuncs.com/google_containers/pause:3.7  registry.aliyuncs.com/google_containers/etcd:3.5.3-0 registry.aliyuncs.com/google_containers/coredns:v1.8.6

#导入镜像
ctr -n=k8s.io images import k8s.1.24.4 

image-20240308224728227

image-20240308230217218

3.5.2 初始化集群过程master01节点

image-20240308230803878

#初始化集群
kubeadm init --config kubeadm.yaml
#初始化过程
[root@k8s-master01 ~]# kubeadm init --config kubeadm.yaml
[init] Using Kubernetes version: v1.24.4
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master01 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.20.220.231 10.20.220.238]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master01 localhost] and IPs [10.20.220.231 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master01 localhost] and IPs [10.20.220.231 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[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
[apiclient] All control plane components are healthy after 14.546159 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master01 as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s-master01 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: abcdef.0123456789abcdef
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy



#安装完成
============================================================
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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You 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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

============================================================
#加入控制节点

  kubeadm join 10.20.220.238:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:54eff049bbe5bf065e5ecfbb55a47535b582b714c9917c97c601a06332c1f465 \
	--control-plane 

Then you can join any number of worker nodes by running the following on each as root:

============================================================
#加入node节点
kubeadm join 10.20.220.238:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:54eff049bbe5bf065e5ecfbb55a47535b582b714c9917c97c601a06332c1f465 

3.5.3 k8s master所有主节点拷贝文件

#创建了k8s集群配置文件
#定制了。默认的ssl证书在哪里,api-server的地址,等信息,在主节点执行

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


mkdir -p $HOME/.kube  #另外两台也创建
[root@k8s-master01 ~]# scp -r /etc/kubernetes/admin.conf   root@k8s-master03:/root/.kube/config
admin.conf                                                100% 5641     2.9MB/s   00:00    
[root@k8s-master01 ~]# scp -r /etc/kubernetes/admin.conf   root@k8s-master02:/root/.kube/config
admin.conf                                                100% 5641     2.5MB/s   00:00    
[root@k8s-master01 ~]# 




[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS     ROLES           AGE     VERSION
k8s-master01   NotReady   control-plane   7m17s   v1.24.4



3.5.4 配置另外两台master节点

#master02  master03上操作
cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/

#把 master01节点的证书拷贝到 master02 master03 
root@k8s-master01:~# scp /etc/kubernetes/pki/ca.crt k8s-master02:/etc/kubernetes/pki/
 
root@k8s-master01:~# scp /etc/kubernetes/pki/ca.crt k8s-master03:/etc/kubernetes/pki/
 
root@k8s-master01:~# scp /etc/kubernetes/pki/ca.key  k8s-master03:/etc/kubernetes/pki/
 
root@k8s-master01:~# scp /etc/kubernetes/pki/ca.key  k8s-master02:/etc/kubernetes/pki/
    

root@k8s-master01:~# scp /etc/kubernetes/pki/sa.key   k8s-master02:/etc/kubernetes/pki/

root@k8s-master01:~# scp /etc/kubernetes/pki/sa.key   k8s-master03:/etc/kubernetes/pki/

root@k8s-master01:~# scp /etc/kubernetes/pki/sa.pub    k8s-master03:/etc/kubernetes/pki/

root@k8s-master01:~# scp /etc/kubernetes/pki/sa.pub    k8s-master02:/etc/kubernetes/pki/
  
root@k8s-master01:~# scp /etc/kubernetes/pki/front-proxy-ca.crt     k8s-master02:/etc/kubernetes/pki/
   
root@k8s-master01:~# scp /etc/kubernetes/pki/front-proxy-ca.crt     k8s-master03:/etc/kubernetes/pki/

root@k8s-master01:~# scp /etc/kubernetes/pki/front-proxy-ca.crt     k8s-master03:/etc/kubernetes/pki/
 
root@k8s-master01:~# scp /etc/kubernetes/pki/front-proxy-ca.key      k8s-master02:/etc/kubernetes/pki/
    
root@k8s-master01:~# scp /etc/kubernetes/pki/front-proxy-ca.key      k8s-master03:/etc/kubernetes/pki/
    
root@k8s-master01:~# scp /etc/kubernetes/pki/etcd/ca.crt       k8s-master03:/etc/kubernetes/pki/etcd/
   
root@k8s-master01:~# scp /etc/kubernetes/pki/etcd/ca.crt       k8s-master02:/etc/kubernetes/pki/etcd/
 
root@k8s-master01:~# scp /etc/kubernetes/pki/etcd/ca.key        k8s-master02:/etc/kubernetes/pki/etcd/
   
root@k8s-master01:~# scp /etc/kubernetes/pki/etcd/ca.key        k8s-master03:/etc/kubernetes/pki/etcd/


#mster02 master03加入控制节点

 
	#加入控制节点

  kubeadm join 10.20.220.238:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:54eff049bbe5bf065e5ecfbb55a47535b582b714c9917c97c601a06332c1f465 \
	--control-plane 

image-202403161500494536

3.5.5 node节点加入集群

3.5.5.1加入master节点报错解决

image-20240311111111224

解决思路:

1、查看firewalld

2、重启systemctl restart containerd.service

3、重置root@k8s-node01:~# kubeadm reset

4、重新生成token

kubeadm token create --print-join-command

我这里两台,第一台重启containerd、重置 kubeadm ,重启后可以了。第二台使用重新生成的token也可以了。

#在node所有节点执行

kubeadm join 10.20.220.238:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:54eff049bbe5bf065e5ecfbb55a47535b582b714c9917c97c601a06332c1f465 
	

image-202403161504084234

4 安装k8s命令补全插件

#k8s命令太多了,非常有必要配置补全

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

5 安装flannel网络

5.1 下载flannel网络插件,配制文件,yaml以及配置文件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#在k8s主节点上,应用这个yaml,基于这个yaml,在创建具体的pod过程。

#如果需要修改pod的运行网络,就要修改配置文件。
 vim /root/flannel/Documentation/kube-flannel.yml #具体位置,就是你刚才git下载到的位置

 #修改pod网络,改成和你初始化集群的时候填写的地址
 [root@k8s-master Documentation]# grep 'Network' -A 5 kube-flannel.yml 
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }

    }
---


#这里修改为你的宿主机网卡,因为pol夸主机通信,需要走你的物理网卡 
165       containers:
166       - name: kube-flannel
167         image: docker.io/flannel/flannel:v0.22.2
168         command:
169         - /opt/bin/flanneld
170         args:
171         - --ip-masq
172         - --kube-subnet-mgr
173         - --iface=ens33   #如果每台机器上的网卡名不一样都要写上,如eth0,ens33 ,在下一行写上


#使用kubectl命令,应用刚才修改后的yaml文件,读取、以及创建pod资源

root@k8s-master01:~# kubectl apply -f ./kube-flannel.yml 
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
root@k8s-master01:~# 
ed

image-20240309002054225

image-20240309002252538

5.2 确保flannel网络创建正确

#查看是否全部运行
root@k8s-master01:~# kubectl -n kube-flannel get pod -owide
NAME                    READY   STATUS    RESTARTS   AGE     IP             NODE           NOMINATED NODE   READINESS GATES
kube-flannel-ds-9fzrm   1/1     Running   0          4m28s   10.20.220.232   k8s-master02   <none>           <none>
kube-flannel-ds-hswjv   1/1     Running   0          4m28s   10.20.220.231   k8s-master01   <none>           <none>
kube-flannel-ds-kdnct   1/1     Running   0          4m28s   10.20.220.234   k8s-node01     <none>           <none>
kube-flannel-ds-ld7qn   1/1     Running   0          4m28s   10.20.220.235   k8s-node02     <none>           <none>
kube-flannel-ds-vm2s9   1/1     Running   0          4m28s   10.20.220.233   k8s-master03   <none>


5.3 网络插件部署完毕后,所有的pod都通过flanned通信

#可以看到所有节点已经ready了
root@k8s-master01:~# kubectl get nodes 
NAME           STATUS   ROLES           AGE   VERSION
k8s-master01   Ready    control-plane   82m   v1.24.10
k8s-master002   Ready    control-plane   34m   v1.24.10
k8s-master03   Ready    control-plane   33m   v1.24.10
k8s-node01     Ready    <none>          28m   v1.24.10
k8s-node02     Ready    <none>          29m   v1.24.10
#表示所有节点都准备好了,现在可以部署pod了

6 给主机打标签

kubectl label node k8s-node01 node-role.kubernetes.io/worker=worker 
kubectl label node k8s-node02 node-role.kubernetes.io/worker=worker 

root@k8s-master01:~# kubectl get nodes 
NAME           STATUS   ROLES           AGE   VERSION
k8s-master01   Ready    control-plane   83m   v1.24.10
k8s-master002   Ready    control-plane   35m   v1.24.10
k8s-master03   Ready    control-plane   34m   v1.24.10
k8s-node01     Ready    worker          30m   v1.24.10
k8s-node02     Ready    worker          30m   v1.24.10

此时node机器就可以和master机器 通信 了,走kubelet进程

root@k8s-master01:~# netstat -ntlup
激活Internet连接 (仅服务器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      907/sshd: /usr/sbin 
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      4818/etcd           
tcp        0      0 127.0.0.1:2381          0.0.0.0:*               LISTEN      4818/etcd           
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      5007/kube-proxy     
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      4887/kubelet        
tcp        0      0 127.0.0.1:10257         0.0.0.0:*               LISTEN      4749/kube-controlle 
tcp        0      0 127.0.0.1:10259         0.0.0.0:*               LISTEN      4759/kube-scheduler 
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      633/systemd-resolve 
tcp        0      0 10.20.220.231:2379       0.0.0.0:*               LISTEN      4818/etcd           
tcp        0      0 10.20.220.231:2380       0.0.0.0:*               LISTEN      4818/etcd           
tcp        0      0 127.0.0.1:35443         0.0.0.0:*               LISTEN      885/containerd      
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      871/cupsd           
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1360/sshd: ubuntu@p 
tcp6       0      0 :::10250                :::*                    LISTEN      4887/kubelet        
tcp6       0      0 :::10256                :::*                    LISTEN      5007/kube-proxy     
tcp6       0      0 :::22                   :::*                    LISTEN      907/sshd: /usr/sbin 
tcp6       0      0 :::6443                 :::*                    LISTEN      4747/kube-apiserver 
tcp6       0      0 ::1:6010                :::*                    LISTEN      1360/sshd: ubuntu@p 
tcp6       0      0 ::1:631                 :::*                    LISTEN      871/cupsd           
udp        0      0 0.0.0.0:631             0.0.0.0:*                           1072/cups-browsed   
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           794/avahi-daemon: r 
udp        0      0 0.0.0.0:40424           0.0.0.0:*                           794/avahi-daemon: r 
udp        0      0 127.0.0.53:53           0.0.0.0:*                           633/systemd-resolve 
udp        0      0 0.0.0.0:8472            0.0.0.0:*                           -                   
udp        0      0 127.0.0.1:323           0.0.0.0:*                           12123/chronyd       
udp6       0      0 :::5353                 :::*                                794/avahi-daemon: r 
udp6       0      0 :::34108                :::*                                794/avahi-daemon: r 
udp6       0      0 ::1:323                 :::*                                12123/chronyd       
root@k8s-master01:~# 

7 kubectl 帮助命令

image-20240309231417932

7.1发出pod创建请求,运行一个nginx-pod

#创建一个nginx-pod
root@k8s-master01:~#  kubectl run nginx --image=nginx
pod/nginx created



#查询pod信息
root@k8s-master01:~# kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          50s   10.244.3.2   k8s-node02   <none>           <none>
root@k8s-master01:~# 


7.2 测试访问nginx页面

#修改nginx首页信息,查看nginx在node1上运行,

root@k8s-master01:~# kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          50s   10.244.3.2   k8s-node02   <none>           <none>
root@k8s-master01:~# 


oot@k8s-master01:~# kubectl exec nginx -it -- sh -c  "echo 6666 >  /usr/share/nginx/html/index.html"

root@k8s-master01:~# curl 10.244.3.2
6666
root@k8s-master01:~# 

8 修改k8s 证书过期,三个master都执行

#查看证书有效时间
root@k8s-master01:~# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not
            Not Before: Mar  8 15:06:13 2024 GMT
            Not After : Mar  8 15:06:13 2025 GMT

cd /etc/kubernetes/pki

# 备份旧证书
mkdir backup_key; cp -rp ./* backup_key/
# 下载项目,自动化修改证书有效期
git clone https://github.com/yuyicai/update-kube-cert.git
cd update-kube-cert/ 
bash update-kubeadm-cert.sh all

#若无法clone项目,可以手动在浏览器中打开后,复制update-kubeadm-cert.sh 脚本内容到机器中执行

# 默认10年,自己可以修改。再次验证,查看集群有效期是10年了(10年后你早跑路了,不做这个操作也罢。哈哈)

root@k8s-master01:/etc/kubernetes/pki/update-kube-cert# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not
            Not Before: Mar  8 16:37:38 2024 GMT
            Not After : Mar  6 16:37:38 2034 GMT

[root@k8s-master update-kube-cert]# 

image-202403161614341892

9 测试k8s集群DNS是否正常

[root@k8s-master ~]# kubectl run busybox --image busybox --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # 
/ # 
/ # ping www.baidu.com
PING www.baidu.com (220.181.38.149): 56 data bytes
64 bytes from 220.181.38.149: seq=0 ttl=54 time=3.781 ms
64 bytes from 220.181.38.149: seq=1 ttl=54 time=4.000 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 3.781/3.890/4.000 ms
/ # 
/ # nslookup kubernetes.default.svc.cluster.local 
Server:		10.96.0.10
Address:	10.96.0.10:53


Name:	kubernetes.default.svc.cluster.local
Address: 10.96.0.1


#查看这些信息,说明k8s正常

10 安装企业私有仓库Harbor

系统优化这些前面的一样

10.1 安装docker 和docker-compose

yum install docker-ce docker-compose -y

10.2 安装harbor

#创建目录
root@docker-hub:~# cd docker_harbor/
root@docker-hub:~/docker_harbor# ls

#上传压缩包,并解压
harbor-offline-installer-v1.9.0-rc1.tgz
root@docker-hub:~/docker_harbor# tar -xf harbor-offline-installer-v1.9.0-rc1.tgz 
root@docker-hub:~/docker_harbor# ls
harbor  harbor-offline-installer-v1.9.0-rc1.tgz

#查看文件
root@docker-hub:~/docker_harbor# cd harbor/
root@docker-hub:~/docker_harbor/harbor# ls
harbor.v1.9.0.tar.gz  harbor.yml  install.sh  LICENSE  prepare
root@docker-hub:~/docker_harbor/harbor# 

harbor.v1.9.0.tar.gz #软件包
harbor.yml  
install.sh  #安装脚本
LICENSE  #授权说明
prepare  #脚本


# 修改部分参数
# harbor软件运行再容器里,映射暴露给宿主机去访问
# yaml 字典语法

hostname: 10.20.220.230
harbor_admin_password: Harbor12345

默认用户 admin
#安装
root@docker-hub:~/docker_harbor/harbor# bash install.sh 


image-20240309142916114

image-20240309145751030

image-20240309145807739

image-20240309145836938

image-20240309145922077

10.3 创建项目

image-20240309150051161

10.4 修改docker配置,信任自建仓库

#手动写入配置
root@docker-hub:~/docker_harbor/harbor# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://eih8mpot.mirror.aliyuncs.com"],
  "insecure-registries":["http://10.20.220.230"]
}


systemctl daemon-reload 
systemctl restart docker.service 

#启动所有挂的容器
root@docker-hub:~/docker_harbor/harbor#  docker start `docker ps -aq`
cc40c5527bef
3342c0023ff4
8bc4fd3cfdbb
72d41a9bc804
f08982c45055
4d99f94ecdbf
e21d703c3a7a
53e952e02cdd
d79ef3fb2fc1

image-20240309150640704

image-20240309150810623

10.5 推送本地镜像(修改镜像tag)

image-20240309151044757

在项目中标记镜像:
docker tag SOURCE_IMAGE[:TAG] 10.20.220.230/ae/IMAGE[:TAG]

推送镜像到当前项目:
docker push 10.20.220.230/ae/IMAGE[:TAG]

#先下载一个nginx镜像
 docker pull nginx

#修改镜像
root@docker-hub:~# docker tag nginx:latest 10.20.220.230/ae/nginx:v1

#登录登录harbor
root@docker-hub:~# docker login 10.20.220.230
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
root@docker-hub:~# docker push 10.20.220.230/ae/nginx:v1 
The push refers to repository [10.20.220.230/ae/nginx]
d874fd2bc83b: Pushed 
32ce5f6a5106: Pushed 
f1db227348d0: Pushed 
b8d6e692a25e: Pushed 
e379e8aedd4d: Pushed 
2edcec3590a4: Pushed 
v1: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
root@docker-hub:~# 

image-20240309151833176

image-20240309153449520

image-20240309153625350

10.6 设置开机自动启动,不太好使,

cat >> /usr/lib/systemd/system/harbor.service  <<EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /root/docker_harbor/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /root/docker_harbor/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF

cat >>  /etc/systemd/system/docker-compose-harbor.service  <<EOF
[Unit]
Description=Docker Compose Harbor Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/root/docker_harbor/harbor
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

EOF




systemctl daemon-reload
systemctl enable harbor --now && systemctl status  harbor.servicer

image-20240309154014306

10.7 测试k8s下载私有仓库容器

直接使用ctr下载要指定文件配置,要不会报错

链接:containerd/docs/hosts.md 在 main ·容器d/containerd ·GitHub上

image-20240309182556814

image-20240309182615634

root@k8s-master01:~# cat cheng-svc-pod-test.yaml 
# 基于deployment创建3个pod,加上标签。
kind: Namespace
apiVersion: v1
metadata:
  name: cheng-svc-test

---
apiVersion: apps/v1      
kind: Deployment         
metadata:
  name: nginx
  namespace: cheng-svc-test  
spec:
  replicas: 3                    
  selector:              
    matchLabels:
      app: nginx
  template:              
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: 10.20.220.230/ae/nginx:v1
        name: container-0
        resources:
          limits:
            cpu: 100m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi

image-20240309194051889

11 设置LoadBalancer模式

LoadBalancer一般都是在公有云上使用,通过负载绑定一个和k8s同网段的ip。咱们自己搭建的环境也可以使用。

链接:MetalLB, bare metal load-balancer for Kubernetes (universe.tf)

image-20240309183811447

image-20240309183156711

11.1 创建pod

#创建目录
mkdir LoadBalancer

#下载yaml文件
wget https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-native.yaml

image-20240309183507963

image-20240309183638079

11.2 使用Layer 2 Configuration模式,这个最简单

1、先创建一个地址池,里面的地址和k8s节点在同一网络

2、在设置L2模式

image-20240309184120562

image-20240309193117223

root@k8s-master01:~/LoadBalancer# cat ippool.yaml 
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.20.220.90-10.20.220.95


root@k8s-master01:~/LoadBalancer# kubectl apply -f ippool.yaml 
ipaddresspool.metallb.io/first-pool created
root@k8s-master01:~/LoadBalancer# vim l2.yaml
root@k8s-master01:~/LoadBalancer# cat l2.yaml 
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

root@k8s-master01:~/LoadBalancer# kubectl apply -f l2.yaml 
l2advertisement.metallb.io/example created
root@k8s-master01:~/LoadBalancer# kubectl -n metallb-system get ipaddresspools.metallb.io 
NAME         AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES
first-pool   true          false             ["10.20.220.0/24"]

11.3 创建LoadBalancer pod


root@k8s-master01:~# cat cheng-load.yaml 
apiVersion: v1
kind: Service
metadata:
  name: cheng-loadip       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂
  namespace: cheng-svc-test    #和之前创建的后端放一个名称空间中
spec:
  selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现
    app: nginx  #之前创建pod中的保持一致
  ports:
  - name: service
    targetPort: 80   # Pod的端口
    port: 80         # Service对外暴露的端口,也就是ClusterIP的port
    protocol: TCP    # 转发协议类型,支持TCP和UDP
  type: LoadBalancer   # Service的类型

image-20240309194441729

12 安装nfs

系统优化和之前的一样,关闭防火墙、虚拟内存

12.1 创建共享文件夹

root@nfs:~# mkdir /nfs

12.2 安装nfs服务端

 yum install nfs-utils rpcbind -y

#创建挂载目录
 mkdir -p /nfs/k8s/

12.3 修改共享权限

#安装NFS服务后,会新增一个/etc/exports文件(即/etc/目录下名为exports的文件),NFS服务根据它的配置来运行。

vim /etc/exports 
#设置所有人都可以连接
/nfs/k8s  *(rw,sync,no_subtree_check)

#设置权限,不然挂载后不能写
 chmod  777 /nfs/k8s/

#重新加载配置
export -ra

#重启服务
systemctl restart nfs-server

systemctl restart rpcbind

12.4安装客户端测试挂载

 yum install nfs-utils -y 
 
[root@k8s-master01 ~]# showmount -e 10.20.220.239
Export list for 10.20.220.239:
/nfs/k8s *
[root@k8s-master01 ~]# 


root@k8s-master01:~# mkdir /share
[root@k8s-master01 ~]# echo "10.20.220.239:/nfs/k8s  /share nfs  defaults 0 0 ">> /etc/fstab
[root@k8s-master01 ~]# monut -a




[root@k8s-master01 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  3.3G   47G    7% /
dev/mapper/centos-home   46G   33M   46G    1% /home
10.20.220.239:/nfs/k8s    50G  1.4G   49G    3% /share
[root@k8s-master01 ~]# 

[root@k8s-master01 ~]# touch /share/aa
[root@k8s-master01 ~]# ls /share/
aa
[root@k8s-master01 ~]# 



image-20240316153922417

13 安装 nfs provisioner,用于配合存储类动态生成 pv

因为nfs是外部的存储,所以需要安装制备器

参考:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

1、创建运行 nfs-provisioner 需要的 sa 账号

[root@k8s-slave1 volumes]# cat serviceaccount.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner

image-20240219164758881

扩展:什么是 sa?

sa 的全称是 serviceaccount。 serviceaccount 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。

指定了 serviceaccount 之后,我们把 pod 创建出来了,我们在使用这个 pod 时,这个 pod 就有了 我们指定的账户的权限了。

2、对 sa 授权

kubectl create clusterrolebinding nfs-provisioner --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

image-20240219164938744

3、安装 nfs-provisioner 程序

在nfs服务器上创建一个共享目录

root@nfs:~# mkdir /nfs/pod_share
root@nfs:~# echo "/nfs/pod_share *(rw,sync,no_subtree_check)" >> /etc/exports
root@nfs:~# exportfs -ra

root@nfs:~# chmod 777 /nfs/pod_share/
#重启服务
systemctl restart nfs-server.service 

image-20240316154530750

[root@nfs 课程资料]# cat nfs-deployment.yaml 

cat > nfs-deployment.yaml <<EOF
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
       app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 10.20.220.239 #改成你自己的地址
            - name: NFS_PATH
              value: /nfs/pod_share   #改成你自己的共享目录
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.20.220.239
            path: /nfs/pod_share
EOF

image-20240219170005738

挂载报错

image-20240311164947542

这个错误是应为pod所在的节点上没安装nfs客户端,安装后就可以了

yum install  nfs-utils  -y

image-20240311171213660

13.1 创建 storageclass,动态供给 pv

[root@k8s-slave1 volumes]# cat nfs-storageclass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nfs
provisioner: example.com/nfs

image-20240219170356895

image-20240316155136852

13.2 创建 pvc,通过 storageclass 动态生成 pv

[root@k8s-slave1 volumes]# cat pvcclaim.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim1
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi
  storageClassName:  nfs

image-20240316155626277

可以看到到 test-claim1 的 pvc 已经成功创建了,绑定的 pv 是pvc-b8526c49-f2ca-4cab-b679-b0d3e65059a4,这个 pv 是由 storageclass 调用 nfs provisioner 自动生成的。

步骤总结:

1、供应商:创建一个 nfs provisioner (只需要创建一次

2、创建 storageclass,storageclass 指定刚才创建的供应商 (只需要创建一次

3、创建 pvc,这个 pvc 指定 storageclass

13.3创建 pod,挂载 storageclass 动态生成的 pvc

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace:
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: 10.20.220.230/ae/nginx:v1
        name: container
        volumeMounts:
        - name: nginxhtml
          mountPath: /usr/share/nginx/html/

      volumes:
      - name: nginxhtml
        persistentVolumeClaim:
          claimName: test-claim1


image-20240319152753930

image-20240319152940590

image-20240319153322482

14 rancher

rancher是一个web界面管理k8s集群的工具,可以通过在web界面点点就可以实现所要的资源。

官网:https://ranchermanager.docs.rancher.com

14.1 安装docker

curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

systemctl stop firewalld  && systemctl disable firewalld 

sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
getenforce 0

swapoff -a
#关闭开机启动
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

yum install chrony -y
sed -i.bak "s@server@#server@g" /etc/chrony.conf 
sed -i "6aserver ntp.aliyun.com iburst" /etc/chrony.conf 
systemctl start chronyd &&systemctl status chronyd 


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

#配置阿里源
yum remove docker docker-common docker-selinux docker-engine -y 
curl -o  /etc/yum.repos.d/docker-ce.repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce   docker-compose -y


 mkdir -p /etc/docker

 cat > /etc/docker/daemon.json <<EOF
{ 
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"insecure-registries":["http://10.20.220.230"]

}
EOF



sudo systemctl daemon-reload &&sudo systemctl restart docker && systemctl enable docker && systemctl status docker

docker info |grep version
 

14.2 安装rancher

[root@localhost rancher]# cat docker-compose.yaml 
version: '3.3'
services:
    rancher:
        image: 'rancher/rancher:v2.7.3'
        ports:
            - '443:443'
            - '80:80'
        restart: unless-stopped
        privileged: true

14.3加入集群

#重置密码
https://ranchermanager.docs.rancher.com/zh/faq/technical-items#如何重置管理员密码

$ docker exec -ti <container_id> reset-password
New password for default administrator (user-xxxxx):
<new_password>



curl --insecure -sfL https://10.20.220.66/v3/import/sxlxvj5rtpprzjcb4k6q55qf82nr4x2ghqr5wscgmxgzjh47n2sssb_c-m-445gjd2b.yaml | kubectl apply -f -

image-20240318165033839

image-20240202101759892

image-20240202101900750

image-20240318165130147

image-20240319094145079

image-20240319111620759

image-20240319111939691

image-20240319153525268

15 配置ingress

image-20240319144727288

image-20240319144805022

image-20240319144915011

image-20240319151345518