kubernetes简单说明
一、工具介绍
1、kubectl
kubectl 负责 “控集群”:作为用户操作入口,通过 API 服务器管理集群资源,是集群的 “操作层”。
2、kubelet
kubelet 负责 “守节点”:在每个节点上监控容器,确保 Pod 按预期运行,是集群的 “执行层”。
3、kubeadm
kubeadm 负责 “搭架子”:初始化集群、加入节点,让集群从 0 到 1 运行起来。
二、容器控制
kubernetes通过CRI标准进行容器管理控制,从version 1.24.0开始,kuberenetes 默认使用 containerd 作为容器运行,如果需要docker支持,需要安装cri-dockerd插件以兼容docker。containerd是更高效小巧更适合kubernetes的容器运行程序,containerd拥有与kubernetes相同的CRI接口标准。
集群服务器准备(全部服务器)
一、设置主机名
服务器1(master主控节点):
1
|
hostnamectl set-hostname k8s-1
|
服务器2(worker节点):
1
|
hostnamectl set-hostname k8s-2
|
服务器3(worker节点):
1
|
hostnamectl set-hostname k8s-3
|
二、设置hosts
1
2
3
4
5
|
vi /etc/hosts
添加ip跟主机名:
192.168.1.100 k8s-1
192.168.1.101 k8s-2
192.168.1.102 k8s-3
|
可以使用命令直接操作
1
|
echo "192.168.56.101 k8s-master" >> /etc/hosts
|
三、关闭SELinux(RedHat 系系统需要操作)
1
2
3
|
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sed -i 's/enforcing/disabled/' /etc/selinux/config
|
四、关闭防火墙
1
2
|
systemctl stop firewalld
systemctl disable firewalld
|
五、关闭swap
1
2
|
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
|
六、时间同步与时区设置
1
2
3
4
5
|
timedatectl set-timezone Asia/Shanghai # 设置时区
apt install -y ntpdate
ntpdate ntp.aliyun.com
crontab -e # 添加时间同步任务
0 */1 * * * ntpdate ntp.aliyun.com
|
七、设置网络
1、设置静态ip、dns等
略,根据不同系统设置
八、设置内核转发
1、添加网络模块自启动
1
2
3
4
5
6
|
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay # 手动启动
modprobe br_netfilter # 手动启动
|
2、添加网桥过滤及内核转发配置文件
1
2
3
4
5
6
|
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system # 重新加载内核参数
|
3、安装ipset跟ipvsadm(可选)
用于提高转发效率,在大规模集群中适用,小规模也可使用系统自带的iptables,不需要额外的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
|
apt-get install -y ipset ipvsadm
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
|
安装kubernetes(全部服务器)
需要根据版本号更改链接中的v版本
一、添加kubernetes阿里云源(debian/ubuntu)并安装
1
2
3
4
5
6
7
8
9
10
11
12
|
# 安装https支持
apt-get update && apt-get install -y apt-transport-https curl gpg
# 请求密钥安装密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
# 更新源
apt-get update
# 可以查看版本
apt-cache policy kubeadm
# 安装
apt-get install -y kubelet kubeadm kubectl
|
二、添加kubernetes阿里云源(centos/redhat)并安装
1
2
3
4
5
6
7
8
9
10
11
12
|
# 添加源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/rpm/repodata/repomd.xml.key
EOF
# 安装
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
|
三、其他源
官方源参考链接:
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
清华源参考链接:
https://mirrors.tuna.tsinghua.edu.cn/help/kubernetes/
安装runc和CNI(全部服务器)
一、下载
runc下载
CNI下载
二、安装
runc
1
|
install -m 755 runc.amd64 /usr/local/sbin/runc
|
CNI
1
2
|
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz
|
安装containerd(全部服务器)
一、下载
到https://github.com/containerd/containerd/releases下载对应的文件版本
建议试用static静态编译版本,包括其它依赖
1
2
|
curl -LO https://github.com/containerd/containerd/releases/download/v2.1.4/containerd-static-2.1.4-linux-amd64.tar.gz
curl -L https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -o /etc/systemd/system/containerd.service
|
二、解压
1
2
|
tar -xzvf containerd-static-2.1.4-linux-amd64.tar.gz -C /tmp/
mv /tmp/bin/* /bin/
|
三、配置containerd
1
2
|
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
|
查看 pause版本
1
|
kubeadm config images list
|
编辑/etc/containerd/config.toml配置文件,将其中的沙盒配置sandbox = 'registry.k8s.io/pause:3.10'修改为对应版本
四、设置服务并启动
编辑/etc/systemd/system/containerd.service,修改ExecStart=/usr/local/bin/containerd为正确的目录
systemctl daemon-reload
systemctl enable –now containerd
初始化主节点(控制节点)
1、生成初始化配置文件
1
|
kubeadm config print init-defaults > kubeadm-config.yaml
|
文件说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# 初始化配置(InitConfiguration):用于kubeadm init命令初始化控制平面时的临时配置,主要涉及节点注册、引导令牌等
bootstrapTokens: # 引导令牌配置:用于新节点加入集群时的身份验证(临时凭证)
- groups: # 令牌所属的用户组(RBAC权限关联)
- system:bootstrappers:kubeadm:default-node-token # 默认节点引导组,关联预定义的bootstrap权限
token: abcdef.0123456789abcdef # 实际令牌值(格式为6位.16位,共23字符),节点加入时需提供此令牌
ttl: 24h0m0s # 令牌有效期(24小时),过期后无法用于新节点加入
usages: # 令牌用途
- signing # 用于签名(如签署节点的TLS bootstrap证书请求)
- authentication # 用于身份认证(节点加入集群时的身份验证)
kind: InitConfiguration # 配置类型:初始化配置(kubeadm init专用)
localAPIEndpoint: # 本地API服务器端点配置
advertiseAddress: 1.2.3.4 # API服务器对外通告的地址(控制平面节点的IP,需其他节点可访问) ##################重点重点重点重点重点##################
bindPort: 6443 # API服务器绑定的端口(默认6443,Kubernetes API标准端口)
nodeRegistration: # 节点注册配置(当前节点作为控制平面节点的注册信息)
criSocket: unix:///var/run/containerd/containerd.sock # 容器运行时接口(CRI)的套接字路径 ##################重点重点重点重点重点##################
# 此处指定containerd的默认套接字,需与实际安装的容器运行时匹配
imagePullPolicy: IfNotPresent # 镜像拉取策略:本地存在则不重复拉取,不存在则拉取
imagePullSerial: true # 是否串行拉取镜像(避免并行拉取导致的网络/存储压力)
name: node # 节点名称(默认会使用主机名,此处显式指定为"node") ##################重点重点重点重点重点##################
taints: null # 节点污点配置(null表示无污点,控制平面节点默认会添加NoSchedule污点,此处可能被覆盖)
timeouts: # 各种操作的超时时间配置
controlPlaneComponentHealthCheck: 4m0s # 控制平面组件健康检查超时时间(4分钟)
discovery: 5m0s # 集群发现过程超时时间(如查找现有控制平面节点,5分钟)
etcdAPICall: 2m0s # 调用etcd API的超时时间(2分钟)
kubeletHealthCheck: 4m0s # kubelet健康检查超时时间(4分钟)
kubernetesAPICall: 1m0s # 调用Kubernetes API的超时时间(1分钟)
tlsBootstrap: 5m0s # TLS证书引导过程超时时间(5分钟)
upgradeManifests: 5m0s # 升级清单(manifest)处理超时时间(5分钟)
---
# 集群配置(ClusterConfiguration):用于定义集群的持久化配置,如网络、证书、组件等
apiServer: {} # API服务器配置(空对象表示使用默认配置,可自定义如启动参数、证书等)
apiVersion: kubeadm.k8s.io/v1beta4 # kubeadm配置的API版本(v1beta4为较新稳定版本)
caCertificateValidityPeriod: 87600h0m0s # CA根证书有效期(87600小时=10年,默认10年)
certificateValidityPeriod: 8760h0m0s # 其他组件证书(如apiserver、kubelet等)的有效期(8760小时=1年)
certificatesDir: /etc/kubernetes/pki # 证书存储目录(默认路径,包含CA、各组件证书和私钥)
clusterName: kubernetes # 集群名称(默认值,影响集群内资源的标识,如DNS域名前缀)
controllerManager: {} # 控制器管理器配置(空对象表示默认,可自定义启动参数如--horizontal-pod-autoscaler-sync-period等)
dns: {} # CoreDNS配置(空对象表示默认,可自定义副本数、资源限制等)
encryptionAlgorithm: RSA-2048 # 用于加密集群敏感数据(如Secret)的算法(默认RSA-2048)
etcd: # etcd数据库配置(Kubernetes的核心数据存储)
local: # 使用本地etcd(单节点集群常用,高可用集群需配置external使用外部etcd)
dataDir: /var/lib/etcd # etcd数据存储目录(默认路径,需确保有足够磁盘空间)
imageRepository: registry.k8s.io # 容器镜像仓库地址(默认使用Kubernetes官方仓库,国内可替换为镜像源)##################重点重点重点重点重点################## 使用阿里云 registry.aliyuncs.com/google_containers
kind: ClusterConfiguration # 配置类型:集群配置(定义集群全局属性)
kubernetesVersion: 1.34.0 # 要安装的Kubernetes版本(需与实际镜像仓库中的版本匹配)
networking: # 集群网络配置
dnsDomain: cluster.local # 集群内部DNS域名(默认值,Pod和Service的DNS后缀)
serviceSubnet: 10.96.0.0/12 # Service的集群IP网段(默认10.96.0.0/12,需与Pod网段不重叠)
podSubnet: 10.244.0.0/16 # Pod的集群IP网段(默认10.244.0.0/16,需与Service网段不重叠) ##################重点重点重点重点重点################## 默认没有pod网段,需要添加此行配置
proxy: {} # kube-proxy配置(空对象表示默认,可自定义模式如ipvs或iptables)
scheduler: {} # 调度器配置(空对象表示默认,可自定义调度策略、启动参数等)
|
2、初始化
通过配置文件进行初始化
1
|
kubeadm init --config kubeadm-config.yaml --upload-certs --v=9
|
–upload-certs # 更新证书
–v=9 # 是详细输出
输出日志示例-成功末尾:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[addons] Applied essential addon: kube-proxy
I0913 14:48:22.831449 3617 loader.go:402] Config loaded from file: /etc/kubernetes/admin.conf
I0913 14:48:22.831745 3617 loader.go:402] Config loaded from file: /etc/kubernetes/admin.conf
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.11.50:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:81c26f4a2bbb3e90695ee7ae6173da86f53259a04bcae8365ab78fc77589f65e
|
用户配置文件(控制节点)
处理用户配置文件
1
2
3
|
mkdir -p ~/.kube
cp -i /etc/kubernetes/admin.conf ~/.kube/config
chown $(id -u):$(id -g) ~/.kube/config
|
加入集群(容器节点)
1
2
|
kubeadm join 192.168.11.50:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:81c26f4a2bbb3e90695ee7ae6173da86f53259a04bcae8365ab78fc77589f65e
|
安装calico网络插件(控制节点)
calico官方文档
1、创建tigera-operator
1
|
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/tigera-operator.yaml
|
2、下载定义资源的yaml
1
|
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/custom-resources.yaml
|
1
2
3
4
5
6
|
# 修改custom-resources.yaml文件,将cidr修改为pods网段,执行创建
#
# 创建资源
kubectl create -f custom-resources.yaml
# 查看pod状态 需要耐心等待拉取镜像
watch kubectl get pods -n calico-system
|
注意事项
1、需要确认cgroup在kubeadm跟kubelet中配置一致
2、尽可能锁住版本,防止更新出现问题
锁定版本:apt-mark hold kubelet kubeadm kubectl
解锁:apt-mark unhold kubelet kubeadm kubectl
重置 kubeadm 环境(会清理集群配置和数据)(控制节点)
查看集群状态(控制节点)
1
2
3
|
kubectl get cs
kubectl get nodes
kubectl get pods -n kube-system
|
部署应用(任意节点)
1、DNS解析验证(控制节点)
1
2
3
4
|
# 查看kube-dns运行状态
kubectl get svc -n kube-system
# DNS请求验证,请求上面的服务地址
dig -t a qq.com @10.96.0.10
|
查看DNS查询信息跟状态判断DNS是否正常
2、编写yaml部署文件
文件内容参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
---
# 部署 Nginx 的 Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxweb # Deployment 名称
spec:
selector:
matchLabels:
app: nginxweb1 # 匹配的 Pod 标签
replicas: 2 # 期望的 Pod 副本数
template:
metadata:
labels:
app: nginxweb1 # Pod 标签(需与 selector 匹配)
spec:
containers:
- name: nginxwebc # 容器名称
image: nginx:latest # 使用的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略
ports:
- containerPort: 80 # 容器内暴露的端口
---
# 暴露 Nginx 的 Service 配置
apiVersion: v1
kind: Service
metadata:
name: nginxweb-service # Service 名称
spec:
externalTrafficPolicy: Cluster # 外部流量策略
selector:
app: nginxweb1 # 匹配的 Pod 标签(与 Deployment 中 Pod 标签一致)
ports: # 端口映射配置
- protocol: TCP # 协议类型
port: 80 # Service 暴露的端口(集群内访问用)
targetPort: 80 # 映射到 Pod 的端口(与容器暴露的端口一致)
nodePort: 30080 # 节点端口(外部访问用)
type: NodePort # Service 类型(放在 spec 层级,而非 ports 内部)
|
3、启动应用
1
|
kubectl apply -f nginx.yaml
|
4、查看应用状态
1
2
|
kubectl get pods
kubectl get service
|
yaml文件详解
1
2
3
4
|
apiVersion: <API版本> # 必选:K8s API 的版本(不同资源版本不同)
kind: <资源类型> # 必选:要创建的资源类型(如 Pod、Deployment、Service)
metadata: <元数据> # 必选:资源的“身份信息”(名称、标签等)
spec: <规格> # 必选:资源的“详细配置”(根据资源类型不同而变化)
|
1. apiVersion:API 版本(必选)
K8s 有很多 API 版本,不同的资源属于不同的版本,这和资源的 “成熟度” 有关(比如测试版、稳定版)。
常见的 API 版本:
v1:最基础的稳定版本,包含一些核心资源(如 Pod、Service、Namespace)。
apps/v1:包含 Deployment、StatefulSet 等 “应用部署相关” 的稳定资源。
networking.k8s.io/v1:包含 Ingress 等 “网络相关” 的资源。
新手不需要死记,知道 “不同资源对应不同版本” 即可,需要时查文档(比如 Deployment 对应 apps/v1,Service 对应 v1)。
2. kind:资源类型(必选)
定义你要创建的 “资源是什么”,K8s 有几十种资源,新手先掌握最常用的几个:
Pod:最小部署单元,包含一个或多个容器。
Deployment:管理 Pod 的部署、更新、扩缩容(最常用)。
Service:暴露 Pod 的网络访问入口(让外界能访问 Pod)。
Namespace:用于隔离集群资源(如开发环境、生产环境分开)。
例如:kind: Deployment 表示这个 YAML 是用来创建一个 Deployment 资源。
3. metadata:元数据(必选)
描述资源的 “身份信息”,就像人的 “姓名、身份证号、标签” 等,核心字段包括:
1
2
3
4
5
6
7
8
|
metadata:
name: <资源名称> # 必选:资源的唯一名称(在同一命名空间内不能重复)
namespace: <命名空间> # 可选:资源所属的命名空间(默认是 default)
labels: <标签-非必要> # 可选:键值对形式的标签(用于标识和筛选资源)
key1: value1
key2: value2
annotations: <注解-非必要> # 可选:额外说明信息(不用于筛选,仅用于描述)
key: value
|
关键说明:
name:必须唯一,比如 name: nginx-deploy 表示这个 Deployment 叫 “nginx-deploy”。
namespace:默认是 default,如果想把资源分到不同环境(如 dev、prod),可以指定命名空间(需提前创建)。
labels:非常重要!是 K8s 中资源关联的 “桥梁”(比如 Service 通过 labels 找到要暴露的 Pod)。格式是键值对,例如 app: nginx、env: dev。
4. spec:规格(必选)
这是 YAML 中最复杂的部分,不同资源的 spec 结构完全不同,它定义了资源的 “具体配置”(即你期望的状态)。
下面用两个最常用的资源举例,理解 spec 的核心逻辑:
Deployment举例:
Deployment 的作用是 “确保指定数量的 Pod 副本运行”,所以它的 spec 会包含:
期望的副本数(replicas)
如何匹配要管理的 Pod(selector)
Pod 的模板(template,定义 Pod 长什么样)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
spec:
replicas: 2 # 期望 2 个 Pod 副本
selector: # 用标签匹配要管理的 Pod(必须和 template 中的 labels 一致)
matchLabels:
app: nginx # 只管理标签为 app:nginx 的 Pod
template: # Pod 模板(定义 Pod 的配置,相当于“Pod 的 YAML”)
metadata:
labels: # Pod 的标签(必须和上面的 selector.matchLabels 一致)
app: nginx
spec: # Pod 的具体配置(和单独定义 Pod 时的 spec 一致)
containers: # Pod 中的容器列表(至少一个)
- name: nginx-container # 容器名称(唯一)
image: nginx:latest # 容器使用的镜像(如 nginx、mysql 等)
ports: # 容器暴露的端口(可选)
- containerPort: 80 # 容器内应用监听的端口(如 nginx 默认 80)
|
Service举例:
Service 的作用是 “给 Pod 提供稳定的访问地址”,所以它的 spec 会包含:
如何找到要暴露的 Pod(selector,通过标签匹配)
端口映射规则(ports,集群内 / 外的端口如何对应)
服务类型(type,决定如何暴露服务)
1
2
3
4
5
6
7
8
9
|
spec:
selector: # 匹配要暴露的 Pod(必须和 Pod 的 labels 一致)
app: nginx # 暴露标签为 app:nginx 的 Pod
ports: # 端口映射规则(可以有多个)
- protocol: TCP # 协议(一般是 TCP)
port: 80 # Service 自身的端口(集群内访问用,比如其他 Pod 访问 service-name:80)
targetPort: 80 # 映射到 Pod 的端口(必须和 Pod 中容器的端口一致)
nodePort: 30080 # 节点端口(仅当 type: NodePort 时需要,外部通过“节点IP:30080”访问)
type: NodePort # 服务类型(NodePort 表示暴露到集群外)
|
5. YAML 语法注意事项
- 缩进严格:YAML 用缩进表示层级关系(只能用空格,不能用 Tab),缩进错误会导致配置无效。
- 列表用短横线:数组 / 列表项前加 -,例如 containers 是列表,每个容器前有 -。
- 键值对格式:key: value(冒号后必须有空格),例如 name: nginx 正确,name:nginx 错误。
- 字符串可加引号也可不加:一般不加,有特殊字符(如空格、冒号)时加引号,例如 name: “my nginx”。
- 多资源用 — 分隔:一个 YAML 文件可以定义多个资源,用 — 分隔(如前面的 Deployment + Service 例子)。
- 用 kubectl explain 查字段:
1
2
3
4
5
6
7
8
|
# 查看 Deployment 的所有字段说明
kubectl explain deployment
# 查看 Deployment 的 spec 字段说明
kubectl explain deployment.spec
# 查看 Service 的 ports 字段说明
kubectl explain service.spec.ports
|