第 1 章 Kubernetes概述
Kubernetes是什么
- Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
- K8S用于容器化应用程序的部署,扩展和管理。
- K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
- Kubernetes目标是让部署容器化应用简单高效。
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内核模块功能说明
- IPVS 核心模块 :
ip_vs:IPVS 负载均衡基础模块ip_vs_rr:轮询(Round Robin)调度算法ip_vs_wrr:加权轮询(Weighted RR)调度算法ip_vs_sh:源地址哈希(Source Hashing)调度算法
- 网络连接与过滤
nf_conntrack_ipv4:IPv4 连接跟踪(NAT/防火墙依赖,新内核中内核版本 ≥4.19 时合并 至 nf_conntrack )ip_tables:iptables 基础框架ipt_REJECT:实现数据包拒绝(REJECT 动作)
- IP 集合管理
ip_set:IP 地址集合管理xt_set & ipt_set:iptables 与 IP 集合的扩展匹配
- 网络隧道与桥接
ipip:IP-over-IP 隧道协议overlay:Overlay 网络支持(如 Docker 跨主机网络)br_netfilter:桥接网络流量过滤(需配合 net.bridge.bridge-nf-call-iptables=1 参 数)
- 反向路径过滤
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
测试访问
or
or


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