二进制安装kubernetes1.26-Day02
一、说明
1.高可用部署说明
1.1 单Master架构
-
单Master节点缺点
- 单点故障,master节点故障后整个k8s节点不可用
- 性能瓶颈
1.2 多master架构
- 多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
同步时间
同步每一台服务器时间,同步方式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
二、安装高可用
部署Haproxy和Keepalived高可用负载均衡器
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
# ping下
ping 192.168.248.188
ping 192.168.248.189
ping 192.168.248.190
ping 192.168.248.191
把ha1上的keepalived停掉,在ha2上查看虚拟ip是否漂移到了ha2
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上是可以正常启动的
在ha2中启动确会报错
错误信息如下,这是因为内核不允许监听没有的地址
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:~#
解决方法:
两个节点都修改
vim /etc/sysctl.conf
# 追加以下内容
net.ipv4.ip_nonlocal_bind = 1
# 生效
sysctl -p
再次启动,已经正常
三、安装habor
1.使用场景
-
ip地址访问
不推荐使用,如果后续地址变更修改起来会非常麻烦
-
http域名访问
不推荐使用,http不加密传输不安全。如果内网使用推荐使用https
-
https自签名证书
不推荐使用,自签证书不被docker、containerd、浏览器信任。
如果需要使用自签名证书(
san
方式)可以参考:https://www.cnblogs.com/punchlinux/p/16499966.html?share_token=60ada202-d2ed-4043-9e79-49bc625678fb注意:
新版本go(1.15+)不在兼容
opessl
方式自签证书,使用的是san
方式。如果要使用自签证书可以参考harobr官方说明:https://goharbor.io/docs/2.4.0/install-config/configure-https/
-
https商业证书
推荐使用,建议使用商业机构签发的证书。公司一般购买商业证书,自用也可以申请免费的证书
免费方式申请
访问阿里云证书地址:https://yundun.console.aliyun.com/?p=cas#/certExtend/buy
点击购买
购买完成后进行证书申请
这里要输入自己的域名
2.安装docker
使用部署脚本安装docker
和docker-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
执行完成后,启动查看
docker version
docker-compose version
3.安装harbor
下载安装包
地址:https://github.com/goharbor/harbor/releases
这里下载2.5.6的离线版本
# 创建安装目录
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不添加)
登录
使用ip地址访问:
使用域名访问(需修改本地hosts文件):
192.168.248.108 harbor.linuxarchitect.io
https://harbor.linuxarchitect.io/
如果有修改配置或重启操作
# 修改配置文件后可以执行以下步骤进行更新
./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 # 输入账号密码
containerd方式
# 修改hosts文件
vim /etc/hosts
192.168.248.108 harbor.linuxarchitect.io
# 登录
nerdctl login harbor.linuxarchitect.io # 输入账号密码
创建一个测试项目
测试上传镜像
# 下载一个nginx镜像
nerdctl pull nginx
# tag
nerdctl tag nginx:latest harbor.linuxarchitect.io/base/nginx:l
# 推送镜像
nerdctl push harbor.linuxarchitect.io/base/nginx:latest
在harbor中查看是否推送成功
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
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
初始化参数
kubeasz可以支持多集群部署管理,需先初始化一个集群并且集群名称不可以相同
创建一个新集群名
# 创建一个集群
cd /etc/kubeasz/
./ezctl new k8s-cluster1
初始化完成后,会在/etc/kubeasz/clusters/
目录下创建一个集群名称对应的目录
如这里创建的名称是k8s-cluster1
目录名就是k8s-cluster1
配置修改
配置一定要仔细注意修改
# 修改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
使用ezctl setup
进行安装,格式说明ezctl setup 集群名称 步骤
安装第一步,集群名称:k8s-cluster1
步骤:01
/etc/kubeasz/ezctl setup k8s-cluster1 01
执行结果
安装第二步
安装etcd
安装前需要在部署机执行以下命令
ln -sv /usr/bin/python3 /usr/bin/python
执行安装
/etc/kubeasz/ezctl setup k8s-cluster1 02
安装结果
验证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
安装第三步
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"
添加安装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/" # 配置文件目录
# 分发配置文件
- name: 创建 nerdctl 配置文件
template: src=nerdctl.toml.j2 dest=/etc/nerdctl/nerdctl.toml # 分发nerdctl配置文件
修改安装目录(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
安装完成后验证
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中找一个现有的镜像
# 测试拉取
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
安装第六步
安装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
node
calico-kube-controllers
执行安装
/etc/kubeasz/ezctl setup k8s-cluster1 06
安装完成后查看状态
calicoctl node status
master节点
node节点
验证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
测试通信
# 进入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
使用同样方法把其它几个pod也都测试一下
5.节点伸缩
添加节点时需要注意:
- 如果之前初始化时没有把新增的节点加到
key-scp.sh
中,需要手动添加一下免密 - 注意新增的节点是否能够下载本地镜像。如
pause
,calico
新增node节点
# 查看一下新增命令
/etc/kubeasz/ezctl --help
执行新增
# 192.168.248.113新增节点ip,k8s_nodename='k8s-node04'设置节点名称
/etc/kubeasz/ezctl add-node k8s-cluster1 192.168.248.113 k8s_nodename='k8s-node04'
执行完成后查看
新增master节点
新增步骤和node一样,执行即可
/etc/kubeasz/ezctl add-master k8s-cluster1 192.168.248.102 k8s_nodename='k8s-master03'
新增节点后,检查calico和pod通信
calicoctl node status
删除节点
# 删除节点和添加基本一致
/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-dns
和coredns
,他们都是用于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
同时要注意配置中的clusterIP
执行部署
kubectl apply -f coredns-v1.9.4.yaml
# 执行完成后,查看状态
kubectl get pod -n kube-system |grep core
测试
部署完成后,测试域名解析是否正常
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
五、部署dashborad
目前dashborad主要分为:
- 官方dashborad,比较简单,功能单一。一般不怎么使用
- ranche,国外开发的。此次不演示,有需要可以参考官网:https://www.rancher.com/
- kuboard
- 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
执行部署
kubectl apply -f dashboard-v2.7.0.yaml -f admin-user.yaml -f admin-secret.yaml
查看
kubectl get pod -A |grep dash
获取token
kubectl get secret -A | grep admin
kubectl -n kubernetes-dashboard describe secret dashboard-admin-user
访问
# 查看端口
root@k8s-master01:~# kubectl get svc -n kubernetes-dashboard |grep kubernetes-dashboard
kubernetes-dashboard NodePort 10.100.245.226 <none> 443:30000/TCP 6m34s
2.kuboard
官网:
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
访问:
用户名: admin 密 码: Kuboard123
管理集群
添加集群
有两种方式:.kubeconfig
和agent
两种方式,这里使用.kubeconfig
按照以下方式把kubeconfig内容拷过来
把kubeconfig添加进去,并修改名称和说明
完成后:
登录集群
选择登录身份
登录后查看
3.kubesphere
官方网址:
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
执行部署
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
安装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文件内容中大致分为两部分:

控制器定义:定义控制器属性
被控制对象: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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了