二进制安装kubernetes1.26-Day02

一、说明

1.高可用部署说明

1.1 单Master架构

  • 单Master节点缺点

    • 单点故障,master节点故障后整个k8s节点不可用
    • 性能瓶颈

    image-20230505125020013

1.2 多master架构

image-20230505130320135

  • 多master,实现高可用及高性能
  • 单独的etcd分布式集群,高可用持久化kubernetes资源对象数据(建议使用高性能硬盘,最好是固态)
  • 多node节点运行业务pod,node节点可以是不同硬件规格、如CPU节点、Memory节点、GPU节点、bigdata节点等
  • 各node节点通过负载均衡器与Master连接,由负载均衡器实现对master的轮训调用及状态监测及故障转移,以在master出现宕机的时候依然可以保持node与master的通信。
  • 各节点可弹性伸缩

2.环境准备

安装软件说明:

软件 版本
操作系统 Ubuntu 22.04 LTS
容器运行时 Containerd
Kubernetes Kubernetes v1.26
Harbor
Etcd

虚拟机环境说明:

类型 IP 主机名 配置 注备
k8s-master01 192.168.248.100 k8s-master01 2C/4G/50G VIP:192.168.248.188
k8s-master02 192.168.248.101 k8s-master02 2C/4G/50G VIP:192.168.248.188
k8s-master03 192.168.248.102 k8s-master03 2C/4G/50G VIP:192.168.248.188
ETCD01 192.168.248.103 etcd01 2C/2G/50G
ETCD02 192.168.248.104 etcd02 2C/2G/50G
ETCD03 192.168.248.105 etcd03 2C/2G/50G
haproxy01 192.168.248.106 haproxy01 1C/1G/50G
haproxy02 192.168.248.107 haproxy02 1C/1G/50G
harbor01 192.168.248.108 harbor01 2C/2G/100G
harbor02 192.168.248.109 harbor02 2C/2G/100G ansible部署节点
k8s-node01 192.168.248.110 k8s-node01 2C/8G/100G
k8s-node02 192.168.248.111 k8s-node02 2C/8G/100G
k8s-node03 192.168.248.112 k8s-node03 2C/8G/100G
k8s-node04 192.168.248.113 k8s-node04 2C/8G/100G

2.系统初始化

修改主机名

# 把每台虚拟机的主机名按对应的进行修改,如master
hostnamectl set-hostname  k8s-master01
hostnamectl set-hostname  k8s-master02
hostnamectl set-hostname  k8s-master03
# 修改完成后检查主机名
hostname

image-20230505225358164

同步时间

同步每一台服务器时间,同步方式chrony (也可以使用kubeasz安装时进行同步)

同步说明:、

https://github.com/easzlab/kubeasz/blob/master/docs/guide/chrony.md

升级内核

如何使用的是Centos7、Ubuntu16.04需要手动进行。这里使用的Ubuntu22.04所以不用进行手动升级

内核升级说明:

https://github.com/easzlab/kubeasz/blob/master/docs/guide/kernel_upgrade.md

二、安装高可用

部署HaproxyKeepalived高可用负载均衡器

1.安装配置keepalived

在192.168.248.106和192.168.248.107使用apt方式安装

# 安装
apt-get  install keepalived -y

配置

ha1配置

# 新建配置
vim /etc/keepalived/keepalived.conf

# 添加以下配置
global_defs { 
   notification_email { 
     acassen@firewall.loc 
     failover@firewall.loc 
     sysadmin@firewall.loc 
   } 
   notification_email_from Alexandre.Cassen@firewall.loc  
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30 
   router_id HA_MASTER
} 

vrrp_instance VI_1 {
    state MASTER
    interface ens33 # 修改为实际网卡
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    priority 100 # 优先级,备服务器设置 90 
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456  # 密码,同一组要保持一致
    }
    virtual_ipaddress {
        192.168.248.188 dev ens33 label ens33:1
        192.168.248.189 dev ens33 label ens33:2
        192.168.248.190 dev ens33 label ens33:3
        192.168.248.191 dev ens33 label ens33:4
    }
}

ha2配置

# 新建配置
vi /etc/keepalived/keepalived.conf

# 添加以下配置
global_defs { 
   notification_email { 
     acassen@firewall.loc 
     failover@firewall.loc 
     sysadmin@firewall.loc 
   } 
   notification_email_from Alexandre.Cassen@firewall.loc  
   smtp_server 127.0.0.1 
   smtp_connect_timeout 30 
   router_id HA_BACKUP
} 

vrrp_instance VI_1 {
    state BACKUP
    interface ens33 # 修改为实际网卡
    virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
    priority 90 # 优先级,备服务器设置 90 
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456  # 密码,同一组要保持一致
    }
    virtual_ipaddress {
        192.168.248.188 dev ens33 label ens33:1
        192.168.248.189 dev ens33 label ens33:2
        192.168.248.190 dev ens33 label ens33:3
        192.168.248.191 dev ens33 label ens33:4
    }
}

启动

# 2d都启动
systemctl daemon-reload
systemctl start  keepalived
systemctl enable  keepalived
# 查看状态
systemctl   status keepalived

测试

在ha1上查看

# 查看虚拟ip
ip addr

image-20230506000740025

# ping下
ping 192.168.248.188
ping 192.168.248.189
ping 192.168.248.190
ping 192.168.248.191

image-20230506000820524

把ha1上的keepalived停掉,在ha2上查看虚拟ip是否漂移到了ha2

image-20230506001352447

ha2正常后此节点停止keepalived,再ha1上启动

2.安装haproxy

同样在192.168.248.106和192.168.248.107使用apt方式安装

apt-get install haproxy -y

配置

在ha1和ha2都配置

vim /etc/haproxy/haproxy.cfg
#  追加以下配置
listen k8s-master-6443
  mode tcp # 一定要是tcp
  bind 192.168.248.188:6443 #监听地址
  # 后端节点地址,这里是k8s master地址和端口
  server 192.168.248.100 192.168.248.100:6443 check inter 2000 fall 3 rise 5
  server 192.168.248.101 192.168.248.101:6443 check inter 2000 fall 3 rise 5
  server 192.168.248.102 192.168.248.102:6443 check inter 2000 fall 3 rise 5

check inter 2000:表示每隔2000毫秒(2秒)检查一次

fall 3 :表示检查失败3次将此地址剔除

rise 5:表示检查正常5次后再将此地址加入

启动

在ha1上先启动

systemctl  daemon-reload
systemctl  start haproxy

这时ha1上是可以正常启动的

image-20230506002950638

在ha2中启动确会报错

image-20230506003523786

错误信息如下,这是因为内核不允许监听没有的地址

root@haproxy02:~# haproxy  -f /etc/haproxy/haproxy.cfg
[WARNING]  (14282) : parsing [/etc/haproxy/haproxy.cfg:23] : 'option httplog' not usable with proxy 'k8s-master-6443' (needs 'mode http'). Falling back to 'option tcplog'.
[NOTICE]   (14282) : haproxy version is 2.4.22-0ubuntu0.22.04.1
[NOTICE]   (14282) : path to executable is /usr/sbin/haproxy
[ALERT]    (14282) : Starting proxy k8s-master-6443: cannot bind socket (Cannot assign requested address) [192.168.248.188:6443]
[ALERT]    (14282) : [haproxy.main()] Some protocols failed to start their listeners! Exiting.
root@haproxy02:~#

image-20230506004127373

解决方法:

两个节点都修改

vim /etc/sysctl.conf
# 追加以下内容
net.ipv4.ip_nonlocal_bind = 1
# 生效
sysctl -p

再次启动,已经正常

image-20230506004259776

三、安装habor

1.使用场景

image-20230506221244876

点击购买

购买完成后进行证书申请

image-20230506221403030

这里要输入自己的域名

image-20230506222418935

2.安装docker

使用部署脚本安装dockerdocker-compose

# 解压
tar xvf runtime-docker20.10.19-containerd1.6.20-binary-install.tar.gz
# 执行安装脚本
bash runtime-install.sh docker

如果报一下错误,则安装一下apt-get install iptables

dockerd[1274]: failed to start daemon: Error initiali
zing network controller: error obtaining controller instance: failed to create
NAT chain DOCKER: Iptables not found

image-20230506232804230

执行完成后,启动查看

docker version
docker-compose version

3.安装harbor

下载安装包

地址:https://github.com/goharbor/harbor/releases

这里下载2.5.6的离线版本

image-20230506222917310

# 创建安装目录
mkdir  /app
# 创建数据存放目录
mkdir /data/harbor -p
# 解压
tar -xvf harbor-offline-installer-v2.5.6.tgz  -C /app/
# 创建证书路径
mkdir /app/harbor/certs
# 解压证书
cd /app/harbor/certs
unzip 9186868_harbor.linuxarchitect.io_nginx.zip

# 配置文件
cd /app/harbor/
cp harbor.yml.tmpl harbor.yml

配置文件修改内容:

hostname: harbor.linuxarchitect.io
https:
  port: 443
  certificate:  /app/harbor/certs/9186868_harbor.linuxarchitect.io.pem
  private_key: /app/harbor/certs/9186868_harbor.linuxarchitect.io.key
data_volume: /data/harbor
harbor_admin_password: 123456

执行安装脚本:

# 查看安装帮助
./install.sh --help
# 开始安装
./install.sh --with-trivy --with-chartmuseum

参数说明:

--with-trivy:启用Trivy镜像漏洞扫描插件;
--with-chartmuseum:启用Helm Chart组件;
--with-notary : 如果启用安全加密端口https可添加该参数(本次使用https不添加)

image-20230509165247039

登录

使用ip地址访问:

https://192.168.248.108/

使用域名访问(需修改本地hosts文件):

192.168.248.108 harbor.linuxarchitect.io

https://harbor.linuxarchitect.io/

image-20230509165912360

如果有修改配置或重启操作

# 修改配置文件后可以执行以下步骤进行更新
./prepare

# 在harbor的解压目录执行
cd /app/harbor
# 关闭
docker-compose down
# 启动 -d表示后台启动
docker-compose up -d

4.测试

docker方式登录

# 修改hosts文件
vim  /etc/hosts
192.168.248.108 harbor.linuxarchitect.io
# 登录
docker login harbor.linuxarchitect.io # 输入账号密码

image-20230510162342647

containerd方式

# 修改hosts文件
vim  /etc/hosts
192.168.248.108 harbor.linuxarchitect.io
# 登录
nerdctl login harbor.linuxarchitect.io # 输入账号密码

image-20230510162948477

创建一个测试项目

image-20230510163515850

测试上传镜像

# 下载一个nginx镜像
nerdctl  pull nginx
# tag
nerdctl tag nginx:latest harbor.linuxarchitect.io/base/nginx:l
# 推送镜像
nerdctl push harbor.linuxarchitect.io/base/nginx:latest

image-20230510163806378

在harbor中查看是否推送成功

image-20230510163849945

5.加入开机自启动

如果有修改配置或重启操作

# 修改配置文件后可以执行以下步骤进行更新
./prepare

# 在harbor的解压目录执行
cd /app/harbor
# 关闭
docker-compose down
# 启动 -d表示后台启动
docker-compose up -d

加入systemd管理

vim /etc/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/goharbor/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /app/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /app/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start harbor
systemctl enable harbor

四、kubeasz安装K8S

1.说明

使用kubeasz工具进行安装,kubeasz 是一个提供快速部署高可用k8s集群的工具, 基于二进制方式部署和利用ansible-playbook实现自动化;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组件。

使用说明:https://github.com/easzlab/kubeasz

选择一台机器作为部署机,这里是使用的harbor02也就是192.168.248.109

部署前规划及准备说明:https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall_intro.md

2.服务器免密登录

登录harbor2服务器

# 安装ansible
apt install ansible -y 

把k8s的master、node节点全部配置免密登录

# 生成密钥
ssh-keygen -t rsa-sha2-512 -b 4096
# 安装sshpass ⽤于分发公钥到各服务器
apt install sshpass -y
# 新建一个分发脚本
cat key-scp.sh
# 把K8S的master、node节点还有ETCD
IP="
192.168.248.100
192.168.248.101
192.168.248.102
192.168.248.103
192.168.248.104
192.168.248.105
192.168.248.110
192.168.248.111
192.168.248.112
192.168.248.113
"
REMOTE_PORT="22"
REMOTE_USER="root"
REMOTE_PASS="123456"
for REMOTE_HOST in ${IP};do
 REMOTE_CMD="echo ${REMOTE_HOST} is successfully!"
 #添加⽬标远程主机的公钥
 ssh-keyscan -p "${REMOTE_PORT}" "${REMOTE_HOST}" >> ~/.ssh/known_hosts
 #通过sshpass配置免秘钥登录、并创建python3软连接
 sshpass -p "${REMOTE_PASS}" ssh-copy-id "${REMOTE_USER}@${REMOTE_HOST}"
 ssh ${REMOTE_HOST} ln -sv /usr/bin/python3 /usr/bin/python
 echo ${REMOTE_HOST} 免秘钥配置完成!
done

# 执行以上脚本
sh key-scp.sh

执行完后测试一下是否可以免密登录

ssh 192.168.248.100

image-20230510220231006

3.安装准备

下载kubeazs

使用版本:kubeasz 3.5.3

# 下载脚本
export release=3.5.3
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown

可以自定义版本修改

# 修改脚本 
vim ezdown
# 以下是版本信息,可以进行修改。比如说可以把K8S_BIN_VER改为1.26.1
DOCKER_VER=20.10.22
KUBEASZ_VER=3.5.3
K8S_BIN_VER=v1.26.1
EXT_BIN_VER=1.7.1
SYS_PKG_VER=0.5.2
HARBOR_VER=v2.6.3
REGISTRY_MIRROR=CN

执行下载脚本下载安装包

chmod +x ./ezdown
# 国内环境
./ezdown -D
# 海外环境
#./ezdown -D -m standard

下载包比较大,下载完后可以查看

ll /etc/kubeasz

image-20230510224224355

初始化参数

kubeasz可以支持多集群部署管理,需先初始化一个集群并且集群名称不可以相同

创建一个新集群名

# 创建一个集群
cd /etc/kubeasz/
./ezctl new k8s-cluster1

image-20230510224930417

初始化完成后,会在/etc/kubeasz/clusters/目录下创建一个集群名称对应的目录

如这里创建的名称是k8s-cluster1目录名就是k8s-cluster1

image-20230510225153011

配置修改

配置一定要仔细注意修改

# 修改hosts文件
vim /etc/kubeasz/clusters/k8s-cluster1/hosts

修改内容

注意:3.5.3版本bin_dir默认参数是/opt/kube/bin/,3.5.2是/usr/local/bin,这里是改成了3.5.2

# 改为etcd服务器的地址
[etcd]
192.168.248.103
192.168.248.104
192.168.248.105
# k8smaster节点地址及节点名
[kube_master]
192.168.248.100 k8s_nodename='k8s-master01'
192.168.248.101 k8s_nodename='k8s-master02'
# 192.168.248.102 k8s_nodename='k8s-master03'(先注释后面扩容)
# k8snode节点地址及节点名
[kube_node]
192.168.248.110 k8s_nodename='k8s-node01'
192.168.248.111 k8s_nodename='k8s-node02'
192.168.248.112 k8s_nodename='k8s-node03'
# 192.168.248.113 k8s_nodename='k8s-node04'(先注释后面扩容)
# 子网配置,注意不同的k8s集群环境子网不能相同,否则k8s集群之间不可以通信
SERVICE_CIDR="10.100.0.0/16"
CLUSTER_CIDR="10.200.0.0/16"
bin_dir="/usr/local/bin"
# config.yml
vim /etc/kubeasz/clusters/k8s-cluster1/config.yml

修改内容

# k8s version
K8S_VER: "1.26.1"
SANDBOX_IMAGE: "harbor.linuxarchitect.io/base_images/pause:3.9"    #修改为本地的镜像仓库
# k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
MASTER_CERT_HOSTS:
  - "192.168.248.188"  # 改为虚拟ip地址
  - "api.myserver.com"
# node节点最大pod 数
MAX_PODS: 110 # 根据实际情况修改,一般110足够使用了
# dns缓存,开启会有一定的性能提升,但是可能会带来其它影响,如某些域名已经修改但是缓存还有
# coredns 自动安装
dns_install: "no"
corednsVer: "1.9.3"
ENABLE_LOCAL_DNS_CACHE: false
dnsNodeCacheVer: "1.22.13"
# 监控组件不装,后续自己安装
# metric server 自动安装
metricsserver_install: "no"
metricsVer: "v0.5.2"
# dashboard也不安装,后续自己安装
# dashboard 自动安装
dashboard_install: "no"
dashboardVer: "v2.7.0"
dashboardMetricsScraperVer: "v1.0.8"
# k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
# 修改为负载均衡的虚拟ip
MASTER_CERT_HOSTS:
  - "192.168.248.188"
  - "k8s.easzlab.io"

4.执行安装

注意:初始化过程中如果有问题想回退,可以使用:./ezctl destroy 集群名 ,类似于kubeadm的reset 此命令会摧毁集群注意小心使用

安装第一步

进行系统初始化

# 查看安装说明
/etc/kubeasz/ezctl -help

image-20230515203757286

使用ezctl setup进行安装,格式说明ezctl setup 集群名称 步骤

安装第一步,集群名称:k8s-cluster1 步骤:01

/etc/kubeasz/ezctl setup k8s-cluster1 01

执行结果

image-20230515204458375

安装第二步

安装etcd

安装前需要在部署机执行以下命令

ln -sv /usr/bin/python3 /usr/bin/python

执行安装

/etc/kubeasz/ezctl setup k8s-cluster1 02

安装结果

image-20230515205857265

验证etcd是否正常

登录其中一台etcd节点,执行以下命令

export NODE_IPS="192.168.248.103 192.168.248.104 192.168.248.105"
# 循环检查
for ip in ${NODE_IPS}; do ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done

image-20230515213049111

安装第三步

master与node节点都需要安装运行时(docker或者containerd)

注意:如果harbor使用的是自签发证书,那么需要将crt文件提前分发到各个master及node节点

pause镜像上传至本地镜像仓库

# 下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
# 打tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 harbor.linuxarchitect.io/base_images/pause:3.9
# 推送本地镜像仓库
docker push harbor.linuxarchitect.io/base_images/pause:3.9

修改pause镜像为本地地址

vim /etc/kubeasz/clusters/k8s-cluster1/config.yml
# 修改内容
# [containerd]基础容器镜像
SANDBOX_IMAGE: "harbor.linuxarchitect.io/base_images/pause:3.9"

添加域名解析

vim /etc/kubeasz/roles/containerd/tasks/main.yml

    - name: 添加域名解析
      shell: "echo '192.168.248.108 harbor.linuxarchitect.io' >> /etc/hosts"

image-20230515232026195

添加安装nerdctl

vim /etc/kubeasz/roles/containerd/tasks/main.yml

# 添加nerdctl配置文件
- block:
    - name: 准备containerd相关目录
      file: name={{ item }} state=directory
      with_items:
      - "{{ bin_dir }}/containerd-bin"
      - "/etc/containerd"
      - "/etc/nerdctl/" # 配置文件目录

image-20230515232753241

# 分发配置文件
    - name: 创建 nerdctl 配置文件
      template: src=nerdctl.toml.j2 dest=/etc/nerdctl/nerdctl.toml # 分发nerdctl配置文件

image-20230515232822481

修改安装目录(3.5.3需要修改,3.5.2需添加内容)

#修改dest={{ bin_dir }}/, 默认值是dest={{ bin_dir }}/containerd-bin/
      copy: src={{ item }} dest={{ bin_dir }}/containerd-bin/ mode=0755 

修改sevice配置文件

vim /etc/kubeasz/roles/containerd/templates/containerd.service.j2
# 修改路径
Environment="PATH={{ bin_dir }}:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart={{ bin_dir }}/containerd

新增配置文件

vim /etc/kubeasz/roles/containerd/templates/nerdctl.toml.j2
# 添加以下内容
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = true

解压安装文件

tar xvf nerdctl-1.3.0-linux-amd64.tar.gz -C /etc/kubeasz/bin/containerd-bin/

Ubuntu 22.04需要修改内核参数(3.5.3不用修改,3.5.2需要)

vim /etc/kubeasz/roles/containerd/templates/config.toml.j2
# 修改内容
SystemdCgroup = true

以上修改完成后执行安装

/etc/kubeasz/ezctl setup k8s-cluster1 03

image-20230516000534301

安装完成后验证

root@k8s-master01:~# runc -v
runc version 1.1.5
commit: v1.1.5-0-gf19387a6
spec: 1.0.2-dev
go: go1.17.10
libseccomp: 2.5.4
root@k8s-master01:~# containerd -v
containerd github.com/containerd/containerd v1.6.20 2806fc1057397dbaeefbea0e4e17bddfbd388f38
root@k8s-master01:~# nerdctl version
WARN[0000] unable to determine buildctl version: exec: "buildctl": executable file not found in $PATH
Client:
 Version:       v1.3.0
 OS/Arch:       linux/amd64
 Git commit:    c6ddd63dea9aa438fdb0587c0d3d9ae61a60523e
 buildctl:
  Version:

Server:
 containerd:
  Version:      v1.6.20
  GitCommit:    2806fc1057397dbaeefbea0e4e17bddfbd388f38
 runc:
  Version:      1.1.5
  GitCommit:    v1.1.5-0-gf19387a6

测试镜像下载,在harbor中找一个现有的镜像

image-20230516000945448

# 测试拉取
nerdctl  pull harbor.linuxarchitect.io/base/nginx:latest

安装第四/五步

安装master和node节点,这一步如果没有自定义配置修改直接执行即可

# master
/etc/kubeasz/ezctl setup k8s-cluster1 04
# node
/etc/kubeasz/ezctl setup k8s-cluster1 05

把配置文件从部署节点拷到master节点

scp .kube/config 192.168.248.100:/root/.kube/
scp .kube/config 192.168.248.101:/root/.kube/

查看节点

kubectl  get node

image-20230516005305269

安装第六步

安装calico网络组件

先查看安装的版本,然后把镜像上传到本地镜像仓库

root@harbor02:~# cat /etc/kubeasz/clusters/k8s-cluster1/config.yml  |grep calico_ver
calico_ver: "v3.24.5"

将部署节点本地的镜像修改tag并上传到镜像仓库

root@harbor02:~# docker  images |grep calico
calico/kube-controllers                                     v3.24.5   38b76de417d5   6 months ago    71.4MB
easzlab.io.local:5000/calico/kube-controllers               v3.24.5   38b76de417d5   6 months ago    71.4MB
calico/cni                                                  v3.24.5   628dd7088041   6 months ago    198MB
easzlab.io.local:5000/calico/cni                            v3.24.5   628dd7088041   6 months ago    198MB
calico/node                                                 v3.24.5   54637cb36d4a   6 months ago    226MB
easzlab.io.local:5000/calico/node                           v3.24.5   54637cb36d4a   6 months ago    226MB

将本地镜像重新打tag

docker tag easzlab.io.local:5000/calico/kube-controllers:v3.24.5 harbor.linuxarchitect.io/base_images/calico-kube-controllers:v3.24.5

docker tag easzlab.io.local:5000/calico/cni:v3.24.5 harbor.linuxarchitect.io/base_images/calico-cni:v3.24.5

docker tag easzlab.io.local:5000/calico/node:v3.24.5 harbor.linuxarchitect.io/base_images/calico-node:v3.24.5

推送镜像

# 如果部署节点没有登录harbor,需要登录一下
echo "192.168.248.108 harbor.linuxarchitect.io" >> /etc/hosts\
docker  login harbor.linuxarchitect.io
# 开始推送
docker push harbor.linuxarchitect.io/base_images/calico-kube-controllers:v3.24.5
docker push harbor.linuxarchitect.io/base_images/calico-cni:v3.24.5
docker push harbor.linuxarchitect.io/base_images/calico-node:v3.24.5

修改yaml文件中镜像地址,一共有四个镜像地址需要修改

root@harbor02:~# grep -w "image" /etc/kubeasz/roles/calico/templates/calico-v3.24.yaml.j2
          image: harbor.linuxarchitect.io/base_images/calico-cni:v3.24.5
          image: harbor.linuxarchitect.io/base_images/calico-node:v3.24.5
          image: harbor.linuxarchitect.io/base_images/calico-node:v3.24.5
          image: harbor.linuxarchitect.io/base_images/calico-kube-controllers:v3.24.5

cni

image-20230516115950228

node

image-20230516120051110

image-20230516120126678

calico-kube-controllers

image-20230516120249803

执行安装

/etc/kubeasz/ezctl setup k8s-cluster1 06

安装完成后查看状态

calicoctl node status

master节点

image-20230516141638837

node节点

image-20230516141623280

验证pod通信是否正常

# 创建几个pod,确保每个节点有有
kubectl run net-test1 --image=alpine sleep 360000
kubectl run net-test2 --image=alpine sleep 360000
kubectl run net-test3 --image=alpine sleep 360000

image-20230516144403815

测试通信

# 进入net-test1
kubectl  exec -it net-test1 sh
# 先ping下外网是否正常
ping 39.156.66.10
# 测试其它节点pod的ip是否正常
ping 10.200.58.193
ping 10.200.135.130

image-20230516144743574

使用同样方法把其它几个pod也都测试一下

5.节点伸缩

添加节点时需要注意:

  1. 如果之前初始化时没有把新增的节点加到key-scp.sh中,需要手动添加一下免密
  2. 注意新增的节点是否能够下载本地镜像。如pause,calico

新增node节点

# 查看一下新增命令
/etc/kubeasz/ezctl --help

image-20230516155451788

执行新增

# 192.168.248.113新增节点ip,k8s_nodename='k8s-node04'设置节点名称
/etc/kubeasz/ezctl add-node k8s-cluster1 192.168.248.113 k8s_nodename='k8s-node04'

执行完成后查看

image-20230516164517059

新增master节点

新增步骤和node一样,执行即可

/etc/kubeasz/ezctl add-master k8s-cluster1 192.168.248.102 k8s_nodename='k8s-master03'

image-20230516170304841

新增节点后,检查calico和pod通信

calicoctl node status

image-20230516175138922

删除节点

# 删除节点和添加基本一致
/etc/kubeasz/ezctl del-node k8s-cluster1 192.168.248.113
/etc/kubeasz/ezctl del-master k8s-cluster1 192.168.248.102
# 记得删除后再使用add添加回去

6.节点升级

由于安装时使用了最新的1.26.4,此次升级先略过。。

7.部署域名解析服务

目前常用的dns组件有kube-dnscoredns,他们都是用于k8s集群中的servicename所对应的IP地址,从kubernetes v1.18开始不再支持kube-dns

部署core-dns

官方地址:

https://github.com/coredns/coredns
https://coredns.io/
https://github.com/coredns/deployment/tree/master/kubernetes

yaml地址:https://github.com/coredns/deployment/blob/master/kubernetes/coredns.yaml.sed

下载镜像

# 下载镜像
nerdctl pull coredns/coredns:1.9.4
# 上传到本地仓库
nerdctl tag coredns/coredns:1.9.4 harbor.linuxarchitect.io/base_images/coredns:1.9.4
nerdctl push harbor.linuxarchitect.io/base_images/coredns:1.9.4

修改yaml文件中的镜像地址

        image: harbor.linuxarchitect.io/base_images/coredns:1.9.4

image-20230517102902212

同时要注意配置中的clusterIP

执行部署

kubectl  apply -f coredns-v1.9.4.yaml
# 执行完成后,查看状态
kubectl  get pod -n kube-system |grep core

image-20230517103630723

测试

部署完成后,测试域名解析是否正常

root@k8s-master01:~# kubectl exec -it net-test1 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ping baidu.com
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: seq=0 ttl=127 time=81.378 ms
64 bytes from 110.242.68.66: seq=1 ttl=127 time=80.397 ms
64 bytes from 110.242.68.66: seq=2 ttl=127 time=80.249 ms
64 bytes from 110.242.68.66: seq=3 ttl=127 time=79.105 ms

image-20230517103858715

五、部署dashborad

目前dashborad主要分为:

  1. 官方dashborad,比较简单,功能单一。一般不怎么使用
  2. ranche,国外开发的。此次不演示,有需要可以参考官网:https://www.rancher.com/
  3. kuboard
  4. kubesphere

1.官方dashborad

# 下载镜像上传本地仓库
nerdctl pull kubernetesui/dashboard:v2.7.0
nerdctl tag kubernetesui/dashboard:v2.7.0 harbor.linuxarchitect.io/base_images/kubernetesui/dashboard:v2.7.0
nerdctl push harbor.linuxarchitect.io/base_images/kubernetesui/dashboard:v2.7.0

nerdctl pull kubernetesui/metrics-scraper:v1.0.8
nerdctl tag kubernetesui/metrics-scraper:v1.0.8 harbor.linuxarchitect.io/base_images/kubernetesui/metrics-scraper:v1.0.8
nerdctl push harbor.linuxarchitect.io/base_images/kubernetesui/metrics-scraper:v1.0.8

修改镜像地址

image: harbor.linuxarchitect.io/base_images/kubernetesui/dashboard:v2.7.0
image: harbor.linuxarchitect.io/base_images/kubernetesui/metrics-scraper:v1.0.8

image-20230517105153217

image-20230517105553060

执行部署

kubectl apply -f dashboard-v2.7.0.yaml -f admin-user.yaml -f admin-secret.yaml

查看

kubectl  get pod -A |grep dash

image-20230517105632148

获取token

kubectl get secret -A | grep admin
kubectl -n kubernetes-dashboard describe secret dashboard-admin-user

image-20230517105731159

访问

# 查看端口
root@k8s-master01:~# kubectl  get svc -n kubernetes-dashboard |grep kubernetes-dashboard
kubernetes-dashboard        NodePort    10.100.245.226   <none>        443:30000/TCP   6m34s

访问:https://nodeip:30000

image-20230517105950431

2.kuboard

官网:

https://kuboard.cn/

https://github.com/eip-work/kuboard-press

安装nfs

kuboard数据需要单独存储的,这里用nfs

# 找一台机器安装nfs。这里用harbor02
apt-get install nfs-server -y
# 创建目录
mkdir -p /data/k8sdata/kuboard
# 修改配置
vim /etc/exports
# 添加以下内容
/data/k8sdata/kuboard *(rw,no_root_squash)
# 启动
systemctl restart nfs-server.service
systemctl enable nfs-server.service

安装kuboard

# 推送镜像到本地
nerdctl  pull swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3

nerdctl  tag swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 harbor.linuxarchitect.io/base_images/kuboard:v3

nerdctl  push harbor.linuxarchitect.io/base_images/kuboard:v3

docker方式安装

docker run -d \
 --restart=unless-stopped \
 --name=kuboard \
 -p 80:80/tcp \
 -p 10081:10081/tcp \
 -e KUBOARD_ENDPOINT="http://192.168.248.109:80" \
 -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
 -v /root/kuboard-data:/data \
 harbor.linuxarchitect.io/base_images/kuboard:v3

docker方式就不演示了,直接使用k8s方式安装演示

K8S方式安装

yaml文件内容:

注意修改nfs和镜像地址

vim kuboard-all-in-one.yaml

---
apiVersion: v1
kind: Namespace
metadata:
  name: kuboard

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.kuboard.cn/name: kuboard-v3
  template:
    metadata:
      labels:
        k8s.kuboard.cn/name: kuboard-v3
    spec:
      #affinity:
      #  nodeAffinity:
      #    preferredDuringSchedulingIgnoredDuringExecution:
      #      - preference:
      #          matchExpressions:
      #            - key: node-role.kubernetes.io/master
      #              operator: Exists
      #        weight: 100
      #      - preference:
      #          matchExpressions:
      #            - key: node-role.kubernetes.io/control-plane
      #              operator: Exists
      #        weight: 100
      volumes:
      - name: kuboard-data
        nfs:
          server: 192.168.248.109
          path: /data/k8sdata/kuboard 
      containers:
        - env:
            - name: "KUBOARD_ENDPOINT"
              value: "http://kuboard-v3:80"
            - name: "KUBOARD_AGENT_SERVER_TCP_PORT"
              value: "10081"
          image: harbor.linuxarchitect.io/base_images/kuboard:v3 
          volumeMounts:
          - name: kuboard-data 
            mountPath: /data 
            readOnly: false
          imagePullPolicy: Always
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /
              port: 80
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          name: kuboard
          ports:
            - containerPort: 80
              name: web
              protocol: TCP
            - containerPort: 443
              name: https
              protocol: TCP
            - containerPort: 10081
              name: peer
              protocol: TCP
            - containerPort: 10081
              name: peer-u
              protocol: UDP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /
              port: 80
              scheme: HTTP
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 1
          resources: {}
      #dnsPolicy: ClusterFirst
      #restartPolicy: Always
      #serviceAccount: kuboard-boostrap
      #serviceAccountName: kuboard-boostrap
      #tolerations:
      #  - key: node-role.kubernetes.io/master
      #    operator: Exists

---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/name: kuboard-v3
  name: kuboard-v3
  namespace: kuboard
spec:
  ports:
    - name: web
      nodePort: 30080
      port: 80
      protocol: TCP
      targetPort: 80
    - name: tcp
      nodePort: 30081
      port: 10081
      protocol: TCP
      targetPort: 10081
    - name: udp
      nodePort: 30081
      port: 10081
      protocol: UDP
      targetPort: 10081
  selector:
    k8s.kuboard.cn/name: kuboard-v3
  sessionAffinity: None
  type: NodePort
kubectl apply -f kuboard-all-in-one.yaml
# 查看
kubectl get pods,svc -n kuboard

image-20230517154750767

访问:

http://192.168.248.100:30080/

用户名: admin 密 码: Kuboard123

image-20230517154811376

管理集群

添加集群

image-20230517155103198

有两种方式:.kubeconfigagent两种方式,这里使用.kubeconfig

image-20230517155116164

按照以下方式把kubeconfig内容拷过来

image-20230517155556580

把kubeconfig添加进去,并修改名称和说明

image-20230517155757139

完成后:

image-20230517155833923

登录集群

image-20230517155918513

选择登录身份

image-20230517155958106

登录后查看

image-20230517160028422

3.kubesphere

官方网址:

https://www.kubesphere.io/zh/

k8s中安装说明:

https://www.kubesphere.io/zh/docs/v3.3/quick-start/minimal-kubesphere-on-k8s/

https://www.kubesphere.io/zh/docs/v3.3/installing-on-kubernetes/introduction/overview/

安装存储类

先在nfs创建共享目录

# 还是在harbor2服务器上创建
mkdir /data/volumes
# 修改配置文件
/data/volumes *(rw,no_root_squash)
# 生效
exportfs -av

修改yaml文件

            - name: NFS_SERVER
              value: 192.168.248.109
            - name: NFS_PATH
              value: /data/volumes

image-20230517230902182

执行部署

kubectl  apply -f 1-rbac.yaml
kubectl  apply -f 2-storageclass.yaml
kubectl  apply -f 3-nfs-provisioner.yaml
# 查看存储类
kubectl get storageclasses.storage.k8s.io

image-20230517231307949

安装kubesphere

# 安装
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.2/kubesphere-installer.yaml

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.3.2/cluster-configuration.yaml

安装检查

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

六、管理命令行与yaml

1.管理命令行

kubectl命令说明

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。

kubectl --help # 查看帮助信息

kubectl create --help # 查看create命令帮助信息
命令 描述
create 通过文件名或标准输入创建资源
expose 将一个资源公开为一个新的Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
get 显示一个或多个资源
explain 文档参考资料
edit 使用默认的编辑器编辑一个资源。
delete 通过文件名、标准输入、资源名称或标签选择器来删除资源。
rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量
certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源(CPU/Memory/Storage)使用。需要Heapster运行
cordon 标记节点不可调度
uncordon 标记节点可调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点taint标记
describe 显示特定资源或资源组的详细信息
logs 在一个Pod中打印一个容器日志。如果Pod只有一个容器,容器名称是可选的
attach 附加到一个运行的容器
exec 执行命令到容器
port-forward 转发一个或多个本地端口到一个pod
proxy 运行一个proxy到Kubernetes API server
cp 拷贝文件或目录到容器中
auth 检查授权
apply 通过文件名或标准输入对资源应用配置
patch 使用补丁修改、更新资源的字段
replace 通过文件名或标准输入替换一个资源
convert 不同的API版本之间转换配置文件
label 更新资源上的标签
annotate 更新资源上的注释
completion 用于实现kubectl工具自动补全
api-versions 打印受支持的API版本
config 修改kubeconfig文件(用于访问API,比如配置认证信息)
help 所有命令帮助
plugin 运行一个命令行插件
version 打印客户端和服务版本信息

2.YAML

YAML说明

YAML 是一种简洁的非标记语言。

Kubernetes使用yaml创建资源对象。

kubectl与yaml部署对比:

  • kubectl适合快速能完成任务
  • yaml适合复杂任务
  • yaml方面复用

语法格式:

  • 缩进表示层级关系

  • 不支持制表符“tab”缩进,使用空格缩进

  • 通常开头缩进 2 个空格

  • 字符后缩进 1 个空格,如冒号、逗号等

  • “---” 表示YAML格式,一个文件的开始

  • “#”注释

YAML内容

在K8S部署应用的YAML文件内容中大致分为两部分:

yaml

控制器定义:定义控制器属性

被控制对象:Pod模板,定义容器属性

具体字段意义:

字段名称 意义
apiVersion API版本
kind 资源类型。
metadata 资源元数据
namespace 命名空间。
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置

YAML编写技巧

  • 获取apiserver版本

    kubectl   api-versions
    

    一般使用控制器部署应用,k8s 1.16版本后使用的都是apps/v1。

    如果不确定api使用的版本,可以去官方文档找对应的示例。

  • 用run命令生成部署模板

    # --dry-run表示生效,只是测试
    kubectl create deployment nginx --image=nginx:1.19 -o yaml --dry-run=client > my-deploy.yaml
    
  • 用get命令将已有部署的应用yaml导出

    kubectl  get deployment  -o yaml  > test.yaml
    
  • 如果某个字段内容不记得了,可以通过explain查看更详细的帮助文档获得

    kubectl explain pod.spec.containers.image
    

示例:

  • 使用yaml创建一个nginx1.18的deployment

    可以参考官网:https://kubernetes.io/zh/docs/tasks/run-application/run-stateless-application-deployment/

    # yaml内容如下:
    # matchLabels /labels中project和app一般对应具体项目名和应用名。也可以自定义添加
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx1.18
    spec:
      replicas: 3
      selector:
        matchLabels:
          project: test
          app: nginx1.18
      template:
        metadata:
          labels:
            project: test
            app: nginx1.18
        spec:
          containers:
          - image: nginx:1.18
            name: nginx-web
            ports:
            - containerPort: 80
            
    # 创建
    kubectl  apply -f nginx-1.18.yaml
    
    # 查看
    kubectl get deploy,pod
    
  • 创建一个service

    可以参考官网:https://kubernetes.io/zh/docs/concepts/services-networking/connect-applications-service/

    # yaml内容如下
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-web
      labels:
        project: test
        app: nginx1.18
    spec:
      ports:
      - port: 10090
        protocol: TCP
        targetPort: 80
      selector:
        project: test
        app: nginx1.18
      type: NodePort
      
    # 创建
    kubectl  apply -f nginx1.18-svc.yaml
    
posted @   xxxy丶  阅读(260)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示