文章目录
-
- [一. 核心组件架构](#一. 核心组件架构)
- [二. 有状态与无状态应用](#二. 有状态与无状态应用)
- [三. 资源对象](#三. 资源对象)
-
- [3.1 规约与状态](#3.1 规约与状态)
- [3.2 资源的分类-元数据,集群,命名空间](#3.2 资源的分类-元数据,集群,命名空间)
-
- [3.2.1 元数据](#3.2.1 元数据)
- [3.2.2 集群资源](#3.2.2 集群资源)
- [3.3 命名空间级](#3.3 命名空间级)
-
- [3.3.1 pod](#3.3.1 pod)
- [3.3.2 pod-副本集](#3.3.2 pod-副本集)
- [3.3.3 pod-控制器](#3.3.3 pod-控制器)
- [四. Kubeadm安装k8s集群](#四. Kubeadm安装k8s集群)
-
- [4.1 初始操作](#4.1 初始操作)
- [4.2 ~~所有节点安装Docker(不建议)~~](#4.2
所有节点安装Docker(不建议)) - [4.2 contained运行时容器安装](#4.2 contained运行时容器安装)
- [4.3 所有节点安装kubernates组件](#4.3 所有节点安装kubernates组件)
- [4.4 安装高可用组件](#4.4 安装高可用组件)
- [4.5 集群初始化](#4.5 集群初始化)
- [4.5.2 安装helm](#4.5.2 安装helm)
- [4.5.3 离线安装Calico](#4.5.3 离线安装Calico)
- [4.5.4 Metrics Server](#4.5.4 Metrics Server)
- [4.5.5 Kuboard](#4.5.5 Kuboard)
- [4.5.6 集群验证](#4.5.6 集群验证)
bash
# containerd常用命令
ctr -n=<namespace> c ls # ctr -n=<namespace> containers list 查看containerd容器
ctr -n=<namespace> i ls # ctr -n=<namespace> images list 查看containerd镜像
ctr ns ls # ctr namespace list 查看containerd命名空间
# 应当交由k8s pod管理。我们很少直接操作容器
ctr -n=<namespace> c rm <容器ID> # 删除容器
ctr -n=<namespace> i rm <镜像ID> # 删除镜像
# kubectl常用命令
kubectl get ns # 查看k8s命名空间
kubectl get nodes # 查看k8s集群节点
kubectl get pods -n <namespace> # 查看某命名空间下所有pod
kubectl get pods -n <namespace> -o wide # 查看pod的详细内容
kubectl logs <pod> -n <namespace> # 查看某容器日志记录
kubectl describe <pod> -n <namespace> # Kubernetes 资源(如 pod、节点和部署)的详细信息
kubectl delete pod <pod> -n <namespace> # 删除容器
kubectl delete namespaces <namespace> # 删除命名空间
kubectl taint nodes k8s-node2 check:NoExecute- # 去除污点
kubectl taint nodes k8s-node2 check=yuanzhang:NoExecute # 设置污点
一. 核心组件架构
Kube-APIServer :集群的控制中枢,各个模块之间信息交耳都需要经过 Kube-APIServer,同
时它也是集群管理、资源配置、整个集群安全机制的入口。
Controller-Manager:集群的状态管理器,保证Pod 或其他资源达到期望值,也是需要和APISewr进行通信,在需要的时候创建、更新或删除它所管理的资源。
Scheduler:集群的调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的 Pod。
Etcd: 键值数据库,报错一些集群的信息,一般生产环境中建议部署三个以上节点(奇数个)
Kubelet: 负责监听节点上 Pod的状态,同时负责上报节点和节点上面Pod 的状态,负责与 Master节点通信,并管理节点上面的Pod。
Kube-proxy:负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。查看 Kube-proxy 工作模式:curl 127.0.0.1:10249/proxyMode
ipvs:监听 Master 节点增加和删除 service 以及 endpoint 的消息,调用 Netlink接口创建相应的IPVS 规则。通过IPVS 规则,将流量转发至相应的Pod上。
Iptables:监听 Master 节点增加和删除 service 以及endpoint 的消息,对于每一个Service,他都会场景一个iptables 规则,将service 的 clusterIP 代理到后端对应的 Pod。
Calico:符合CNI标准的网络插件,给每个Pod 生成一个唯一的IP地址,并且把每个节点当做一个路由器。Ciliume
CoreDNS:用于 Kubernetes 集群内部 Service 的解析,可以让 Pod 把 Service 名称解析成 IP 地址,然后通过 Service的IP地址进行连接到对应的应用上。
Containerd: 容器引擎,负责对容器的管理。
Pod: Pod 是 Kubernetes 中最小的单元,它由一组、一个或多个容器组成,每个 Pod 还包含了一个 Pause 容器,Pause 容器是 Pod 的父容器,主要负责僵尸进程的回收管理,通过通过 Pause容器可以使同一个 Pod 里面的多个容器共享存储、网络、PID、IPC等。为不同的容器厂商提供了标准的CRI接口,实现容器调用。
二. 有状态与无状态应用
简单理解: 有数据存储的中间件是有状态应用,反之则是无状态.
无状态 | 有状态 | |
---|---|---|
缺点 | 不能存储数据,需要额外的数据服务支撑 | 集群环境下需要实现主从、数据同步、备份、水平扩容复杂 |
优点 | 对客户端透明,无依赖关系,可以高效实现扩容、迁移 | 可以独立存储数据,实现数据管理 |
三. 资源对象
Kubernetes中的所有内容都被抽象为"资源",如Pod、service.Node等都是资源。"对象"就是"资源"的实例,是持久化的实体。如某个具体的Pod、某个具体的Node。Kubernetes使用这些实体去表示整个集群的状态。
3.1 规约与状态
spec
"是"规约"、"规格"的意思,spec是必需的,它描述了对象的期望状态(Desired state) ------希望对象所具有的特征。当创建Kubernetes对象时,必须提供对象的规约
,用来描述该对象的期望状态,以及关于对象的一些基本信息(例如名称)。
status
表示对象的实际状态,该属性由k8s自己维护,k8s会通过一系列的控制器对对应对象进行管理,让对象尽可能的让实际状态与期望状态重合。
3.2 资源的分类-元数据,集群,命名空间
大致分为三类: 元数据,集群,命名空间
3.2.1 元数据
一句话概括:对Kubernetes的所有资源实施了弹性约束和全局约束,并对实例的创建规则进行了描述。
Horizontal Pod Autoscaler (HPA) :
PodTemplate
LimitRange
3.2.2 集群资源
Namespace
Node
ClusterRole
ClusterRoleBinding
不能绑定到元数据上的资源
3.3 命名空间级
3.3.1 pod
为什么我们需要Pod?当我们仅有运行时环境时,我们希望多个高度耦合的Java项目能够共享同一个数据卷,以实现数据共享。然而,在一对多的管理情况下,这变得极其不方便。
建议: 在一个Pod中关联了紧耦合的容器。通常情况下,一个Pod只包含一个容器。
3.3.2 pod-副本集
扩缩容的基础实例
3.3.3 pod-控制器
管理pod的控制器有很多,负责pod的无状态,有状态,定时任务,守护进程等的管理
无状态服务-扩缩容控制器 ReplicaSet(RS)
无状态服务-Deployment 针对RS的扩展,具备额外的滚动升级,回滚暂停恢复等
有状态服务-StatefulSet 专门针对于有状态服务进行部署的一个控制器
一句话总结: 保证无缝切换数据不丢失,同时确保项目能够访问新的容器地址,并保持集群主从关系的稳定,就像Redis哈希槽分区一样,确保分区不会混乱。
- 稳定的持久化存储: 即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
- 稳定的网络标志: 稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有 Cluster IP 的 Service)来实现
- 有序部署,有序扩展: 有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0到 N-1,在下一个Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现
- 有序收缩,有序删除: 有序收缩,有序删除(即从 N-1 到 0)
Headless Service | 用于定义网络标志(DNS domain)DNS:域名服务将域名与 ip 绑定映射关系服务名 => 访问路径(域名) => ip |
volumeClaimTemplate | 用于创建持久化模板,类似docker数据卷 |
DaemonSet | DaemonSet 保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。 |
job | 一次定时任务 |
cronjob | 周期定时任务 |
服务发现
service | Pod 不能直接提供给外网访问,而是应该使用 service。Service 就是把 Pod 暴露出来提供服务 |
Ingress | Ingress 可以提供外网访问 Service 的能力。可以把某个请求地址映射、路由到特定的 service。ingress 需要配合 ingress controller 一起使用才能发挥作用,ingress 只是相当于路由规则的集合而已,真正实现路由功能的,是 Ingress Controller,ingress controller 和其它 k8s 组件一样,也是在 Pod 中运行。 |
配置与存储
- Volume :数据卷,共享 Pod 中容器使用的数据。用来放持久化的数据,比如数据库数据。
- CSI: Container Storage Interface 是由来自 Kubernetes、Mesos、Docker 等社区成员联合制定的一个行业标准接口规范,旨在将任意存储系统暴露给容器化应用程序。CSI 规范定义了存储提供商实现 CSI 兼容的 Volume Plugin 的最小操作集和部署建议。CSI 规范的主要焦点是声明 Volume Plugin 必须实现的接口。
- ConfigMap: 用来放配置,与 Secret 是类似的,只是 ConfigMap 放的是明文的数据,Secret 是密文存放。
- Secret : Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec 中。Secret 可以以 Volume 或者环境变量的方式使用。
Secret 有三种类型:
Service Account:用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;
Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;
kubernetes.io/dockerconfigjson:用来存储私有 docker registry 的认证信息。 - DownwardAPI : downwardAPI 这个模式和其他模式不一样的地方在于它不是为了存放容器的数据也不是用来进行容器和宿主机的数据交换的,而是让 pod 里的容器能够直接获取到这个 pod 对象本身的一些信息。
downwardAPI 提供了两种方式用于将 pod 的信息注入到容器内部:
环境变量:用于单个变量,可以将 pod 信息和容器信息直接注入容器内部
volume 挂载:将 pod 信息生成为文件,直接挂载到容器内部中去
role/rolebinding
四. Kubeadm安装k8s集群
bash
kubectl debug #设置临时容器
sidecar # 本地文件日志filebeat收集和业务容器顺序定义
volumn # 更改目录权限,1.18之后不建议修改权限,文件数量大可能起不来容器
configMap和Secret #1.18后不支持运行时修改,避免热更新出错,导致生产事故
至少有 master,node节点服务器
操作系统: Centos7
K8S: 1.24+ 运行时环境不支持docker
运行时环境: Contanied,CRI-O
4.1 初始操作
https://github.com/kubernetes/kubernetes/issues/53533
主机名 | ip |
---|---|
k8s-master01 | 192.168.0.101 |
k8s-master02 | 192.168.0.102 |
k8s-master03 | 192.168.0.103 |
k8s-node01 | 192.168.0.104 |
k8s-node02 | 192.168.0.105 |
k8s-node03 | 192.168.0.106 |
k8s-loadblancer | 192.168.0.107 |
所有节点
配置dns映射文件
bash
vi /etc/hosts
192.168.0.101 k8s-master01
192.168.0.102 k8s-master02
192.168.0.103 k8s-master03
192.168.0.104 k8s-node01
192.168.0.105 k8s-node02
192.168.0.106 k8s-node03
192.168.0.107 k8s-loadblancer
systemctl disable --now firewalld
systemctl disable --now dnsmasg
#systemctl disable --now NewworkManager #Centos8无需关闭
setenforce 0
#=========start ========
vim /etc/sysconfig/selinux
# 修改selinux参数
SELINUX=disabled
#=========end =========
# swap启用后,在使用磁盘空间和内存交换数据时,性能表现会较差,会减慢程序执行的速度
# kubelet 在 1.8 版本以后强制要求 swap 必须关闭
swapoff -a && sysctl -w vm.swappiness=0
vim /etc/sysctl.conf
#======start==========
net.ipv4.ip_local_port_range = 1024 65535
#======end==========
sysctl -p
#===== 注释swap静态文件读取,有些云服务器没有====
vi /etc/fstab
# /swap.img none swap sw 0 0
# 安装同步时间
yum install ntpdate -y
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' > /etc/timezone
ntpdate ntp1.aliyun.com
#加入到crontab
crontab -e
# =========================
*/5 * * * * ntpdate ntp1.aliyun.com
# =========================
# 配置网络
# 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat >> /etc/sysctl.d/k8s.conf << EOF
#####################################
#关闭ipv6协议
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6=1
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
#######################################
EOF
sysctl --system # 生效
Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在 Master01上操作,
集群管理也在 Master01 上操作,阿里云或者 AWS 上需要单独一台kubectl服务器。密钥配置如下:
只在主节点进行
bash
ssh-keygen -t rsa
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-node03;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
所有节点
安装负载均衡配置:
bash
yum install ipvsadm ipset sysstat conntrack libseccomp
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack # nf_connectrack_ipv4
# 设置开机自启动
vi /etc/modules-load.d/ipvs.conf
# ==========================
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack #nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
# ==========================
systemctl enable --now systemd-modules-load.service
# 检查是否加载
lsmod | grep -e ip_vs -e nf_conntrack
install ipset ipvsadm -y
reboot
4.2 所有节点安装Docker(不建议)
需要说明的是k8s 1.24+以停止维护docker,需要额外安装docker-ce符合k8s容器接口标准。或者仅安装containerd容器
docker底层containerd。 之前k8s依赖顶层docker,docker操作containerd。但是docker不符合cri标准,被k8s踢出局了。直接对接底层contained。然后可以用containerd或者cri-o等,cri-o和docker一个级别,但是符合cri标准。
所有节点安装
查阅K8S适配容器
本博主采用欧拉系统,华为云HCE,以及欧拉操作系统开放源自基金会对于yum/dnf源,官方源都有问题。。最后看了一篇csdn成功了换源,如下
bash
# 使用华为云服务Yum安装软件的时候提示错误:
# Error: Failed to download metadata for repo 'epel': Cannot download repomd.xml
https://blog.csdn.net/qq_58551342/article/details/137334183
https://cloud.tencent.com/developer/article/2383890
centos7,8系统
bash
# 配置docker源
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum clean all
# 重新构建缓存索引
yum makecache
# 查看可用docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
# 安装最新版本的 Docker Engine 和 containerd,或者进入下一步安装特定版本:
yum install docker-ce docker-ce-cli containerd.io -y
systemctl enable --now docker
4.2 contained运行时容器安装
bash
# 配置软件源
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
# 修改安装源为国内地址
sed -i 's#https://download.docker.com#https://mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
# openEuler 的使用方式近似 CentOS,因此,修改软件源的配置,使用 centos 7 的软件源
sed -i 's#$releasever#7#g' /etc/yum.repos.d/docker-ce.repo
yum clean all
yum makecache
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 应用 sysctl 参数而无需重新启动
sudo sysctl --system
# 移除之前安装的
remove docker docker-engine docker.io containerd runc
yum install containerd -y
修改配置,符合k8s标准
bash
# 生成默认配置
mkdir -p /etc/containerd
# 生成默认配置文件并写入到 config.toml 中
containerd config default | sudo tee /etc/containerd/config.toml
# 配置containerd
vim /etc/containerd/config.toml
#==========start============
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # false 修改为 true
[plugins."io.containerd.grpc.v1.cri"]
...
# sandbox_image = "k8s.gcr.io/pause:3.6" crictl images list | grep pause
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" #这里一定要注意,要根据下载到本地 pause镜像的版本来进行修改,否则初始化会过不去。
#==========end============
# 创建指定配置目录
mkdir /etc/containerd/certs.d/docker.io -pv
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://xxxxxxxx.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
systemctl daemon-reload
systemctl enable --now containerd
4.3 所有节点安装kubernates组件
所有节点安装
欧拉操作系统,参考如下
bash
# 欧拉操作系统
https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/thirdparty_migration/k8sinstall.html
bash
#添加 kubernetes 仓库 欧拉不执行
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=1
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
yum clean all
yum makecache
yum list kubeadm.x86_64 --showduplicates | sort -r
#yum install -y kubelet-1.18.20 kubeadm-1.18.20 kubectl-1.18.20 kubernetes-cni-1.18.20
# 安装kubeadm会把 kubelet,kubectl cni都装上
yum install -y kubeadm-1.28.2-0
# 设置Kubelet开机自启动
systemctl daemon-reload
systemctl enable --now kubelet
4.4 安装高可用组件
负载均衡节点或者所有master节点安装
bash
yum install keepalived haproxy -y
vim /etc/haproxy/haproxy.cfg
#============start=============
# 由于 lb1 和 lb2 上安装了 Keepalived 和 HAproxy,
# 如果其中一个节点故障,虚拟 IP 地址(即浮动 IP 地址)将自动与另一个节点关联,
# 使集群仍然可以正常运行,从而实现高可用。
global
log /dev/log local0 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kube-apiserver
bind *:6444
mode tcp
option tcplog
default_backend kube-apiserver
backend kube-apiserver
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
# 请注意 server 字段。请记住 6443 是 apiserver 端口, 代理到的master节点
server kube-apiserver-1 192.168.0.101:6443 check # Replace the IP address with your own.
server kube-apiserver-2 192.168.0.102:6443 check # Replace the IP address with your own.
server kube-apiserver-3 192.168.0.103:6443 check # Replace the IP address with your own.
#============end============
systemctl restart haproxy
systemctl enable --now haproxy
vim /etc/keepalived/keepalived.conf
#============start==========
global_defs {
notification_email {
}
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
## 检测haproxy程序脚本
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
vrrp_instance haproxy-vip {
state BACKUP
priority 100
# 对于 interface 字段,您必须提供自己的网卡信息。您可以在机器上运行 ifconfig 以获取该值。
interface eth0 # Network card
virtual_router_id 60
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 为 unicast_src_ip 提供的 IP 地址是您当前机器的 IP 地址,公网ip
unicast_src_ip 192.168.0.101 # The IP address of this machine
# 对于也安装了 HAproxy 和 Keepalived 进行负载均衡的其他机器,必须在字段 unicast_peer 中输入其 IP 地址。
unicast_peer { # 公网ip
# 192.168.0.102 # The IP address of peer machines
}
virtual_ipaddress { # 公网ip
# 192.168.0.10/24 # The VIP address
}
track_script {
chk_haproxy
}
}
#===========end===========
# 启动
systemctl restart keepalived
systemctl enable --now keepalived
4.5 集群初始化
利用 kubeadm 创建高可用集群
只在一个master节点初始化
bash
# 节点初始化 均为私网地址,后期通过
# --control-plane-endpoint 负载均衡节点,其他node节点以此为准,一般为公网ip
# --kubernetes-version 初始化的k8s版本要和kubeadm一致
# --image-repository 镜像源
# --pod-network-cidr配置pod网络段,calico需要和其一致 子网划分套用
# --service-cidr 直接套用
# -- apiserver-advertise 当前master节点,内网ip
kubeadm init --control-plane-endpoint "192.168.0.101:6444" \
--upload-certs \
--kubernetes-version=v1.28.2 \
--image-repository=registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.0.101 \
--apiserver-bind-port=6443 \
---cri-socket unix:///run/containerd/containerd.sock
# 初始化失败执行以下内容
kubeadm reset
# 查看组件状态
kubectl get pods -n kube-system
# iptables修改为ipvs
kubectl edit configmaps kube-proxy -n kube-system
# 删除之前的kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
# 验证代理模式
kubectl get pod -n kube-system | grep kube-proxy
kubectl logs kube-proxy-bk7pl -n kube-system
netstat -lntp | grep kube-proxy
curl 127.0.0.1:port/proxyMode
bash
# 查看token过期时间
kubeadm token list
# 假如token过期
# 生成node节点token
kubeadm token create --print-join-command
# 生成master的
kubeadm init phase upload-certs --upload-certs
#master节点
kubeadm join 197.168.0.101:80 --token 6btwxm.ln24af24fj4zna76 \
--discovery-token-ca-cert-hash sha256:898981bce15f5f4f8654c7a8f8ade7f2c5ea626193f90add6b208df6972362a0 \
--control-plane --certificate-key 104fc0e4d56387568a5962c1a8cbb1f42c1395b0704c10fcfd8b753369bfd5fb
#node节点
kubeadm join 197.168.0.101:80 --token 6btwxm.ln24af24fj4zna76 \
--discovery-token-ca-cert-hash sha256:898981bce15f5f4f8654c7a8f8ade7f2c5ea626193f90add6b208df6972362a0
4.5.2 安装helm
Helm 图表是一种为 Kubernetes(类似于操作系统或操作系统)打包应用程序的方法。ArgoCD 等工具也使用 Helm 来管理集群中的应用程序,负责安装、升级(如果需要时回滚)等。
bash
wget https://get.helm.sh/helm-v3.15.1-linux-amd64.tar.gz
tar -zxvf helm-v3.15.1-linux-amd64.tar.gz \
&& mv linux-amd64/helm /usr/local/bin/ \
&& rm -rf linux-amd64
4.5.3 离线安装Calico
本节参考自 离线安装calico
解压calico离线包并将所需文件上传至服务器
首先将calico.yaml文件上传至服务器
然后使用cat calico.yaml |grep image:命令查看calico所需的镜像包。
bash
cat calico.yaml |grep image:
这里显示安装calico需要三个镜像,去解压的离线包imgaes文件夹中找到对应的三个离线镜像包文件,这里对应的分别是calico-cni.tar,calico-kube-controllers.tar和calico-node.tar三个离线包,将这三个离线镜像上传至服务器。
可以使用ctr namespace ls
命令查看containerd的命名空间。k8s的命名空间为k8s.io
离线镜像导入containerd的k8s命名空间中,使用containerd的导入镜像命令将calico的离线镜像包导入到k8s的命名空间中
bash
ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-kube-controllers.tar
ctr -n k8s.io images import calico-node.tar
用之前上传的calico.yaml文件安装calico,calico.yaml可根据自己的实际需要修改。
yaml
vi calico.yaml
#=========start=======
#修改calico.yaml里的pod网段。 和kubadm init时候 pod-network-cidr参数保持一致
#把calico.yaml里pod所在网段改成kubeadm init时选项--pod-network-cidr所指定的网段,
#直接用vim编辑打开此文件查找192,按如下标记进行修改:
- name: IP
value: "autodetect"
- name: IP_AUTODETECTION_METHOD #添加该环境变量
value: "interface=eth.*|ens.*"
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
#========end ==========
# 为主节点和工作节点添加特定公网 IP 的注释
kubectl annotate node k8s-node01 projectcalico.org/IPv4Address=203.0.113.1
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
4.5.4 Metrics Server
对于 Kubernetes,Metrics API 提供了一组基本的指标,以支持自动伸缩和类似的用例。 该 API 提供有关节点和 Pod 的资源使用情况的信息, 包括 CPU 和内存的指标。
metrics-server 会请求每台节点的 kubelet 接口来获取监控数据,接口通过 HTTPS 暴露,但 Kubernetes节点的 kubelet 使用的是自签证书,若 metrics-server 直接请求 kubelet接口,将产生证书校验失败的错误,因此需要在 components.yaml 文件中加上 --kubelet-insecure-tls启动参数。
且由于 metrics-server 官方镜像仓库存储在 k8s.gcr.io ,国内可能无法直接拉取,您可以自行同步到 CCR或使用已同步的镜像 ccr.ccs.tencentyun.com/mirrors/metrics-server:v0.7.1
yaml
# 下载 yaml 部署文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml
# containerd容器下载
ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1
vi components.yaml
#=========start=========
# 修改 metrics-server 启动参数
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls # 加上该启动参数
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 # 国内集群,请替换成这个镜像
#=========end=========
kubectl apply -f components.yaml
kubectl taint nodes kube-system check:NoExecute- # 去除污点
kubectl get pod -n kube-system | grep metrics-server
4.5.5 Kuboard
bash
#kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
vi kuboard-v3-swr.yaml
#========start=======
#KUBOARD_SERVER_NODE_PORT: '30080'
KUBOARD_ENDPOINT: http://kuboard-v
#=======end========
kubectl apply -f kuboard-v3-swr.yaml
watch kubectl get pods -n kuboard
#访问 Kuboard
#在浏览器中打开链接 http://your-node-ip-address:30080
#输入初始用户名和密码,并登录
#用户名: admin
#密码: Kuboard123
# 卸载
kubectl delete -f kuboard-v3-swr.yaml
rm -rf /usr/share/kuboard
4.5.6 集群验证
bash
kubectl get po --all-namespaces -owide