49.k8s集群部署

第 1 章 Kubernetes概述

Kubernetes是什么

  • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
  • K8S用于容器化应用程序的部署,扩展和管理。
  • K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
  • Kubernetes目标是让部署容器化应用简单高效。

官方网站:http://www.kubernetes.io

k8s版本

  • 1.19之前 默认支持容器运行时:docker

  • 1.20 --- 1.23 同时支持docker和containerd

  • 1.24 --- 默认支持containerd

虚拟机 IAAS 基础架构即服务

容器 PAAS 平台即服务

应用软件 ASSA 应用即服务

​ MAAS 模型即服务

​ FAAS 函数即服务(无服务架构)

Kubernetes特性

  • 自我修复:
    • 在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量
    • 杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
  • 弹性伸缩:
    • 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;
    • 业务低峰时回收资源,以最小成本运行服务
  • 自动部署和回滚:
    • K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
  • 服务发现和负载均衡:
    • K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题
  • 机密和配置管理:
    • 管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
  • 存储编排:
    • 挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
  • 批处理:
    • 提供一次性任务,定时任务;满足批量数据处理和分析的场景。

Kubernetes集群架构与组件

  • kubectl:命令行操作工具,发送请求
  • auth:控制集群的访问权限
  • API Server:集群入口,同一处理所有请求
  • scheduler:计算创建pod的合适节点
  • controller-manager:监控集群状态,确保集群符合期望状态
  • Etcd:集群数据库,存储所有资源配置和状态
  • kubelet:接收API Server指令,管理pod的生命周期
  • kube-proxy:网络代理,维护pod网络规则和四层负载均衡
  • pod:container的集合(一个pod中的container的ip地址是pod的地址)

https协议管理集群

密钥、证书在admin.conf文件中

Master组件

  • **kube-apiserver:**Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储。
  • **kube-controller-manager:**处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager 就是负责管理这些控制器的。
  • kube-scheduler:根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在 同一个节点上,也可以部署在不同的节点上。
  • etcd:分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。

Node组件

  • **kubelet:**kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创 建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每 个Pod转换成一组容器。
  • **kube-proxy:**在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
  • **docker或rocket:**容器引擎,运行容器。

Kubernetes核心概念

  • Pod

    • 最小部署单元
    • 一组容器的集合
    • 一个Pod中的容器共享网络命名空间
    • Pod是短暂的
  • Controllers

    • ReplicaSet : 确保预期的Pod副本数量

    • Deployment : 无状态应用部署

    • StatefulSet : 有状态应用部署

    • DaemonSet : 确保所有Node运行同一个Pod

    • Job : 一次性任务

    • Cronjob : 定时任务

    更高级层次对象,部署和管理Pod

  • Service

    • 防止Pod失联
    • 定义一组Pod的访问策略
  • Label : 标签,附加到某个资源上,用于关联对象、查询和筛选

  • Namespaces : 命名空间,将对象逻辑上隔离

  • Annotations :注释

部署k8s集群

使用CentOS 7-template模版克隆

主机ip 主机名
192.168.108.130 k8s-master
192.168.108.131 k8s-node1
192.168.108.132 k8s-node2

前置环境部署(三节点同时)

主机配置

1:普通升级内核
bash 复制代码
 yum update -y kernel && reboot
2:设置系统主机名和hosts文件
bash 复制代码
2:设置系统主机名和hosts文件
cat >>/etc/hosts<<EOF
192.168.108.130 k8s-master
192.168.108.131 k8s-node01
192.168.108.132 k8s-node02
EOF
3:安装环境包
bash 复制代码
yum -y install vim lrzsz unzip wget net-tools tree bash-completion \
conntrack ntpdate ntp ipvsadm ipset iptables \
curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
类别 软件包 核心功能
文件操作 vim , lrzsz , unzip 编辑/上传下载/解压 ZIP
网络管理 net-tools , ipvsadm 网络配置/IPVS 负载均衡
系统监控 sysstat , psmisc 性能监控/进程管理
开发编译 gcc , make 代码编译/自动化构建
安全防护 iptables , libseccomp 防火墙/容器系统调用限制
4:关闭防火墙和内核安全机制
bash 复制代码
systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0
5:关闭swap分区
bash 复制代码
#启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区
swapoff -a && sed -i '/swap/s/^/#/'  /etc/fstab
6:调整系统内核参数
bash 复制代码
cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1     
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发,转发IPv4的数据包
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1                   
EOF

# 立即生效
sysctl --system
7:配置时间同步
bash 复制代码
systemctl restart chronyd
# 列出 Chrony 守护进程当前配置和使用的所有时间源(NTP 服务器)及其同步状态信息
chronyc sources -v  
hwclock -s   #将硬件时钟的时间同步到系统时钟
8:配置IPVS功能
bash 复制代码
yum -y install ipvsadm ipset sysstat conntrack libseccomp(已安装)

# 添加ipvs模块和内核模块
cat >>/etc/modules-load.d/ipvs.conf<<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4         #内核4.19以上版本设置为nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF

IPVS内核模块功能说明

  1. IPVS 核心模块 :
    • ip_vs:IPVS 负载均衡基础模块
    • ip_vs_rr :轮询(Round Robin)调度算法
    • ip_vs_wrr :加权轮询(Weighted RR)调度算法
    • ip_vs_sh :源地址哈希(Source Hashing)调度算法
  2. 网络连接与过滤
    • nf_conntrack_ipv4 :IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并 至 nf_conntrack )
    • ip_tables :iptables 基础框架
    • ipt_REJECT :实现数据包拒绝(REJECT 动作)
  3. IP 集合管理
    • ip_set :IP 地址集合管理
    • xt_set & ipt_set :iptables 与 IP 集合的扩展匹配
  4. 网络隧道与桥接
    • ipip :IP-over-IP 隧道协议
    • overlay :Overlay 网络支持(如 Docker 跨主机网络)
    • br_netfilter :桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参 数)
  5. 反向路径过滤
    • ipt_rpfilter :反向路径验证(防 IP 欺骗)

典型应用场景

Kubernetes 节点初始化:IPVS 模式 kube-proxy 依赖这些模块

负载均衡服务器:启用 IPVS 调度算法

容器网络配置:Overlay 和桥接模块支持

bash 复制代码
# 重启服务
systemctl restart systemd-modules-load

# 查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 

# nf_conntrack是Linux内核中用于连接跟踪的模块,它负责跟踪网络连接的状态,包括连接的建立、维护和终止,以及相关的网络数据包的处理。这个模块在防火墙、网络地址转换(NAT)、负载均衡等网络功能中起着重要作用。

安装containerd

注意:k8s v1.24 版本以后放弃对Docker Engine的支持,而采用containerd容器进行时。

containerd 是一个高级容器运行时,又名容器管理器。简而言之,它是一个守护进程,在单个主机上管理整个容器生命周期:创建、启动、停止容器、拉取和存储镜像、配置装载、网络等。

containerd 被设计为易于嵌入到更大的系统中。Docker 引擎使用 containerd 来运行容器。Kubernetes 可以通过 CRI 使用 containerd 来管理单个节点上的容器。

配置containerd环境

9:安装containerd软件
bash 复制代码
# 指定 containerd 在系统启动时加载的内核模块
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 加载模块
modprobe overlay
modprobe br_netfilter

# 立即生效
sysctl --system

# 安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast

# 查看containerd版本
yum list containerd.io --showduplicates | sort -r

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

# 生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml

# 修改containerd的驱动程序
//125行
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml

# 修改镜像仓库地址
//61行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

# 启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd

# 查看containerd版本
ctr version
1.6.16
10:镜像加速配置
bash 复制代码
vim /etc/containerd/config.toml
//145行
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"

mkdir /etc/containerd/certs.d
mkdir /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml
# 以下是文档全部内容
server = "https://docker.io"
[host."https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub-mirror.c.163.com"]
  capabilities = ["pull","resolve","push"]

[host."https://do.nark.eu.org"]
  capabilities = ["pull","resolve","push"]

[host."https://dc.j8.work"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerproxy.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.mirrors.ustc.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.nju.edu.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://registry.docker-cn.com"]
  capabilities = ["pull","resolve","push"]

[host."https://hub.uuuadc.top"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.anyhub.us.kg"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.jobcher.com"]
  capabilities = ["pull","resolve","push"]

[host."https://dockerhub.icu"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.ckyl.me"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.awsl9527.cn"]
  capabilities = ["pull","resolve","push"]

[host."https://mirror.baidubce.com"]
  capabilities = ["pull","resolve","push"]

[host."https://docker.1panel.live"]
  capabilities = ["pull","resolve","push"]


# 启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd

# 查看containerd版本
ctr version
1.6.16

#测试下载镜像
ctr images pull docker.io/library/httpd:latest --hosts-dir=/etc/containerd/certs.d

# 查看镜像
[root@k8s-node2 ~]# ctr i ls
REF                            TYPE                                    DIGEST                                                                  SIZE     PLATFORMS                                                                                                              LABELS 
docker.io/library/httpd:latest application/vnd.oci.image.index.v1+json sha256:e19cdd61f51985351ca9867d384cf1b050487d26bb1b49c470f2fcda1b5f276c 43.1 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/riscv64,linux/s390x,unknown/unknown -

or配置docker-ce环境

bash 复制代码
# 前置环境安装
yum install -y yum-utils device-mapper-persistent-data lvm2

说明:

yum-utils 提供了 yum-config-manager

device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理

的块设备驱动提供了一个高度模块化的内核架构。

bash 复制代码
# 使用阿里云镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo

# 安装docker-ce
yum install -y docker-ce

# 启动docker服务
systemctl enable --now docker

# 镜像加速和修改cgroup方式
{
  "registry-mirrors": [
    "https://05vz3np5.mirror.aliyuncs.com",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://registry.docker-cn.com",
    "https://hub-mirror.c.163.com",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn",
    "https://mirror.baidubce.com",
    "https://docker.1panel.live"
  ],   # 注意分隔符号
  "exec-opts": ["native.cgroupdriver=systemd"]  # 添加cgroup方式
}

# 重新启动服务
systemctl daemon-reload
systemctl restart docker

# cri-dockerd安装
wget https://github.com/mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.e17.x86_64.rpm

作用:cri-dockerd 的主要作用是为 Docker Engine 提供一个符合 Kubernetes CRI(Container

Runtime Interface)标准的接口,使 Docker 能继续作为 Kubernetes 的容器运行时(Container

Runtime),尤其是在 Kubernetes1.24版本后,官方移除对原生 Docker 支持(dockershim)之后。

bash 复制代码
# 下载完成后直接安装
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm

# 编辑服务配置文件
vim /usr/lib/systemd/system/cri-docker.service
#编辑第10行,中间添加 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://

# 启动cri-dockerd服务
systemctl daemon-reload
systemctl start cri-docker.service
systemctl enable cri-docker.service

kubernetes集群部署

11:安装kubeadm和kubectl
bash 复制代码
# 添加k8s软件源
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

# 快速建立yum缓存
yum makecache fast

# 查看k8s版本
yum list kubectl --showduplicates | sort -r

# 安装指定版本k8s
yum -y install kubectl-1.28.0 kubelet-1.28.0 kubeadm-1.28.0

kubelet使用systemd来作为cgroup驱动,使系统运行稳定,限制Pod和容器的资源使用情况,如cpu、内存等。

注意:k8s v1.22开始,使用 kubeadm 创建集群时,默认使用systemd为cgroup驱动程序;

bash 复制代码
# 修改kubelet的crgoup与containerd的crgoup保持一致
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

# kubelet设置为开机自启动
systemctl daemon-reload
systemctl enable kubelet

# 各工具包作用
kubeadm:快速部署kubernetes集群的工具
kubelet:在集群中的每个节点上用来启动Pod和容器等
kubectl:负责管理kubernetes集群的命令行工具

# 查看k8s版本
kubelet --version 或 kubeadm version
12:配置crictl工具(containerd部署)
bash 复制代码
# crictl 是CRI兼容的容器运行时命令行接口,可以使用它来检查和调试 kubelet节点上的容器运行时和镜像

# 设置crictl连接containerd
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

集群初始化(master节点)

13:集群初始化
bash 复制代码
# 查看k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images list --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers


# 下载k8s集群所需要的镜像
# containerd版
[root@k8s-master ~]# kubeadm config images pull --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers

# 部署docker,使用以下命令
[root@k8s-master ~]# kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock --kubernetes-version=v1.28.0 \
--image-repository=registry.aliyuncs.com/google_containers


# 查看k8s集群所有的镜像
[root@k8s-master ~]# crictl images ls
显示
IMAGE                                                             TAG                 IMAGE ID            SIZE
registry.aliyuncs.com/google_containers/coredns                   v1.10.1             ead0a4a53df89       16.2MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0             73deb9a3f7025       103MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.0             bb5e0dde9054c       34.6MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.0             4be79c38a4bab       33.4MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.0             ea1030da44aa1       24.6MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.0             f6f496300a2ae       18.8MB
registry.aliyuncs.com/google_containers/pause                     3.9                 e6f1816883972       322kB

# 初始化集群自动开启IPVS
# 创建初始化集群配置文件
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm-init.yaml

# 修改初始化集群配置文件
[root@k8s-master ~]# vim kubeadm-init.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: 192.168.108.130   #12行 修改master节点ip
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock   #15行 修改容器进行时
  # criSocket: unix:///var/run/cri-dockerd.sock   #docker配置
  imagePullPolicy: IfNotPresent
  name: k8s-master                   #17行 修改master节点主机名
  taints:                            #18行  注意!去掉null
  - effect: NoSchedule               #19行 添加污点(污点:不在该节点创建任何资源;亲和:优先创建在该节点)
    key: node-role.kubernetes.io/control-plane     #20行 添加
---
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    #32行 修改镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.28.0            #34行 修改k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16           #38行 增加pod网段
scheduler: {}

# 末尾添加
---                                  #更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---                                  #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1 
kind: KubeletConfiguration
cgroupDriver: systemd

# 初始化集群  (若是出现卡顿,则初始化失败)
[root@k8s-master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log

# 显示 
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/

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

kubeadm join 192.168.100.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:ed3d99a29dda0cf925d25765bc1031380cd1542ce6b1bad444a6ccea8a4fc242
如果集群初始化失败
bash 复制代码
# 1.重置处理:
1:删除kubernetes目录中所有内容
rm -rf /etc/kubernetes/*

# 2:删除启动端口进程
pkill -9 kubelet
pkill -9 kube-controll
pkill -9 kube-schedule

# 3:重置sock文件
# containerd版
kubeadm reset -f --cri-socket=unix:///var/run/containerd/containerd.sock
# docker版
kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
bash 复制代码
# 查看 kube-proxy 代理模式
curl localhost:10249/proxyMode

# 注意:k8s集群初始化失败,查看日志解决
journalctl -xeu kubelet 或 tail kubeadm-init.log

配置kubectl工具

Kubectl 是一个用于操作Kubernetes集群的命令行工具。

kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它kubeconfig 文件。

14:配置kubectl工具
bash 复制代码
#(根据初始化成功后的提示进行配置)
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

# 永久生效
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source  ~/.bash_profile

在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。认证,指向master地址,方便api-server通信)

15:查看组建状态
bash 复制代码
[root@k8s-master ~]# kubectl get cs
显示
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE   ERROR
controller-manager   Healthy   ok        
scheduler            Healthy   ok        
etcd-0               Healthy   ok

node工作节点操作

16:node工作节点加入集群(两个node)
bash 复制代码
# 端口号6443:通常用于Kubernetes集群的API接口,提供对集群的管理和控制。

# containerd部署
[root@k8s-node01 ~]#kubeadm join 192.168.100.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:ed3d99a29dda0cf925d25765bc1031380cd1542ce6b1bad444a6ccea8a4fc242
	
# docker使用以下命令
[root@k8s-node01 ~]#kubeadm join 192.168.100.128:6443 --token abcdef.0123456789abcdef \
	--discovery-token-ca-cert-hash sha256:ed3d99a29dda0cf925d25765bc1031380cd1542ce6b1bad444a6ccea8a4fc242 --cri-socket unix:///var/run/cri-dockerd.sock
17:查看集群节点状态
bash 复制代码
# 此时,k8s内部不具备网络功能,因此节点信息都是 "Not Ready" 状态
[root@k8s-master .kube]# kubectl get nodes
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   18m   v1.28.0
k8s-node01   NotReady   <none>          82s   v1.28.0
k8s-node02   NotReady   <none>          5s    v1.28.0
NotReady状态原因:
  • CNI组件 calico,使用BGP动态路由协议
  • 证书过期
  • 网络中断

此处没有部署CNI组件

部署网络CNI组建

kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod的ip地址段,也称为cidr。

bash 复制代码
# 下载Calico文件
[root@k8s-master ~]# wget --no-check-certificate https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

# 修改Calico文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"
  
# 部署Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
显示
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created

验证检查

bash 复制代码
# 查看所有pod运行情况
[root@k8s-master ~]# kubectl get pods -A  (-A查看所有命名空间)
NAMESPACE     NAME                                       READY   STATUS     RESTARTS   AGE
kube-system   calico-kube-controllers-658d97c59c-2fzjk   0/1     Pending    0          10s
kube-system   calico-node-l49vm                          0/1     Init:0/3   0          10s
kube-system   calico-node-lkczs                          0/1     Init:0/3   0          10s
kube-system   calico-node-p8rv5                          0/1     Init:0/3   0          10s
kube-system   coredns-66f779496c-d5wp4                   0/1     Pending    0          24m
kube-system   coredns-66f779496c-f9fdn                   0/1     Pending    0          24m
kube-system   etcd-k8s-master                            1/1     Running    0          24m
kube-system   kube-apiserver-k8s-master                  1/1     Running    0          24m
kube-system   kube-controller-manager-k8s-master         1/1     Running    2          24m
kube-system   kube-proxy-lgkbd                           1/1     Running    0          8m18s
kube-system   kube-proxy-ljx2l                           1/1     Running    0          24m
kube-system   kube-proxy-pz67k                           1/1     Running    0          8m24s
kube-system   kube-scheduler-k8s-master                  1/1     Running    2          24m

/etc/kubernetes/manifests/目录下存放Kubernetes集群中各个组件的Pod配置文件。

通常会包含以下几个重要的配置文件:

  • etcd.yaml:用于部署和管理etcd集群的配置文件
  • kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
  • kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
  • kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件

当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据这些配置文件创建和管理对应的Pod。

ca证书默认存放在/etc/kubernetes/pki/目录下

bash 复制代码
# 查看集群节点状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   42m   v1.28.0
k8s-node1    Ready    <none>          26m   v1.28.0
k8s-node2    Ready    <none>          26m   v1.28.0

完成后优化操作

bash 复制代码
# 主节点安装kubectl命令自动补全

# 1)安装bash-completion工具
[root@k8s-master ~]# yum install bash-completion -y

# 2)执行bash_completion
[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion

# 3)加载kubectl completion
# 在当前bash环境中临时设置命令补全
[root@k8s-master ~]# source <(kubectl completion bash)
# 在当前bash环境中永久设置命令补全
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source  ~/.bashrc

测试

bash 复制代码
# 创建Nginx服务
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3
deployment.apps/nginx created

# 正在创建pod
[root@k8s-master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-7854ff8877-2khvl   0/1     ContainerCreating   0          25s
nginx-7854ff8877-7hlcl   0/1     ContainerCreating   0          25s
nginx-7854ff8877-c97g5   0/1     ContainerCreating   0          25s

[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
nginx-7854ff8877-2khvl   1/1     Running   0          2m47s   10.244.36.67     k8s-node1   <none>           <none>
nginx-7854ff8877-7hlcl   1/1     Running   0          2m47s   10.244.169.129   k8s-node2   <none>           <none>
nginx-7854ff8877-c97g5   1/1     Running   0          2m47s   10.244.169.130   k8s-node2   <none>           <none>

# 暴露端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
service/nginx exposed

[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-7854ff8877-2khvl   1/1     Running   0          16m   10.244.36.67     k8s-node1   <none>           <none>
nginx-7854ff8877-7hlcl   1/1     Running   0          16m   10.244.169.129   k8s-node2   <none>           <none>
nginx-7854ff8877-c97g5   1/1     Running   0          16m   10.244.169.130   k8s-node2   <none>           <none>

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        3h58m
nginx        NodePort    10.102.205.141   <none>        80:32026/TCP   31s

# 删除一个pod
[root@k8s-master ~]# kubectl delete pod nginx-7854ff8877-2khvl
pod "nginx-7854ff8877-2khvl" deleted

# 发现pod自动创建,且pod的ip发生变化
[root@k8s-master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-7854ff8877-7hlcl   1/1     Running   0          19m   10.244.169.129   k8s-node2   <none>           <none>
nginx-7854ff8877-c97g5   1/1     Running   0          19m   10.244.169.130   k8s-node2   <none>           <none>
nginx-7854ff8877-ghkwf   1/1     Running   0          40s   10.244.36.68     k8s-node1   <none>           <none>

# service的ip不变
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        4h2m
nginx        NodePort    10.102.205.141   <none>        80:32026/TCP   3m51s
[root@k8s-master ~]# kubectl get endpoints
NAME         ENDPOINTS                                             AGE
kubernetes   192.168.108.130:6443                                  4h2m
nginx        10.244.169.129:80,10.244.169.130:80,10.244.36.68:80   4m5s

测试访问

http://192.168.108.130:32026/

or

http://192.168.108.131:32026/

or

http://192.168.108.132:32026/

854ff8877-c97g5 1/1 Running 0 19m 10.244.169.130 k8s-node2

nginx-7854ff8877-ghkwf 1/1 Running 0 40s 10.244.36.68 k8s-node1

相关推荐
Pocker_Spades_A3 小时前
面向云原生架构的时序数据库选型:在国际主流 TSDB 谱系中理解 Apache IoTDB比
云原生·架构·时序数据库
nihui1233 小时前
微服务解决方案 netflix与alibaba哪个好?
微服务·云原生·架构
螺旋小蜗4 小时前
docker-compose文件属性(3)顶部元素networks
运维·docker·容器
ICT董老师4 小时前
Kubernetes从私有镜像仓库拉取容器镜像时的身份验证
ubuntu·docker·云原生·容器·kubernetes
tzhou644524 小时前
Kubernetes持久化存储:从Volume到PV/PVC与StorageClass动态存储
云原生·容器·kubernetes
goodlook01235 小时前
open-java21镜像构建
java·运维·docker·容器
2501_901164415 小时前
“一次性沙箱”把开发内耗降到了0。
kubernetes
MoFe16 小时前
【Docker】windows系统wsl如何操作DOCKER
云原生·eureka
星环处相逢6 小时前
Kubernetes 核心指南:Pod 控制器与配置资源管理全解析
云原生·容器·kubernetes