吃透 K8s 核心基础:命名空间、上下文切换、Pod 深度剖析
Namespace and Contexts
学习参考:Namespace
Namespace 介绍
**问题:**多个用户共用同一套 Kubernetes 集群时,如何实现各自创建资源的逻辑隔离?
答案:Namespace,简写 ns,也可称作 project,代表一组资源集合,用于对集群资源做分组管理。借助 Namespace,Kubernetes 能够将单套物理集群从逻辑上切分为多组独立资源集合,每一组集合对应一个 Namespace,不同 Namespace 内的资源完全相互隔离。
Kubernetes 集群默认预置四类命名空间:
- default:创建资源时若未手动指定 Namespace,资源会默认归入该命名空间。
- kube-system:集群自身运行所需的系统组件资源,统一存放于此。
- kube-public:该命名空间下的所有对象,可供集群内全部用户(含未完成身份校验的匿名用户)读取访问。
- kube-node-lease:存储各节点对应的 Lease 租约对象,节点依靠租约机制向控制平面持续发送心跳,用于集群检测节点运行故障。
思考:是否所有 Kubernetes 资源都归属于某一个 Namespace?
**答:**绝大多数资源(例如 Pod、Service、PVC 等)都隶属于命名空间,但 Namespace 资源本身不属于任何命名空间;Node 节点、持久卷 PersistentVolume 这类底层资源,同样不存在所属 Namespace。
Namespace 管理
# 查看Namespace清单
root@master30 ~ 15:54:51# kubectl get ns
NAME STATUS AGE
default Active 56m
kube-node-lease Active 56m
kube-public Active 56m
kube-system Active 56m
# 获取Namespace资源yaml格式定义文件
root@master30 ~ 16:49:53# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2026-08-05T07:53:30Z"
labels:
kubernetes.io/metadata.name: default
name: default
resourceVersion: "42"
uid: 2087a5ee-1aa8-4122-a2dd-3800309b2e26
spec:
finalizers:
- kubernetes
status:
phase: Active
# 创建Namespace
root@master30 ~ 16:50:24# kubectl create ns liu
namespace/liu created
# 注意:命名空间名称满足正则表达式[a-z0-9]([-a-z0-9]*[a-z0-9])?,最大长度为63位
# 直接编辑Namespace
root@master30 ~ 16:50:41# kubectl edit ns liu
# 查看Namespace详细信息
root@master30 ~ 16:51:16# kubectl describe ns liu
Name: liu
Labels: kubernetes.io/metadata.name=liu
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
# 删除Namespace
root@master30 ~ 16:51:22# kubectl delete ns liu
namespace "liu" deleted
# 注意:
# 删除一个namespace会自动删除该namespace中所有资源。
# default和kube-system命名空间不可删除。
Namespace 也可通过 YAML 配置文件完成创建。
root@master30 ~ 16:53:09# touch ns-liu.yaml
root@master30 ~ 16:53:50# vim ns-liu.yaml
# ns-liu.yaml
apiVersion: v1
kind: Namespace
metadata:
name: liu
root@master30 ~ 16:56:41# kubectl apply -f ns-liu.yaml
namespace/liu created
操作指定命名空间内的资源对象时,需通过-n参数声明目标命名空间,示例如下:
root@master30 ~ 16:57:03# kubectl run web --image=nginx -n liu
pod/web created
root@master30 ~ 16:58:53# kubectl get pod -n liu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 3m15s 10.224.133.65 worker31.liu.cloud <none> <none>
root@master30 ~ 17:00:44# curl -s 10.224.133.65 | grep nginx
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
<p>If you see this page, nginx is successfully installed and working.
<a href="https://nginx.org/">nginx.org</a>.<br/>
<a href="https://community.nginx.org/">community.nginx.org</a>.<br/>
<a href="https://f5.com/nginx">f5.com/nginx</a>.</p>
<p><em>Thank you for using nginx.</em></p>
Namespace 切换
kubernetes 自带工具
查看当前上下文绑定的命名空间
root@master30 ~ 09:14:17# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
输出结果中NAMESPACE列无内容,代表当前上下文未绑定任何命名空间。
为当前上下文设置默认命名空间
root@master30 ~ 09:23:23# kubectl config set-context --current --namespace=liu
Context "kubernetes-admin@kubernetes" modified.
此时,NAMESPACE 列对应的属性为 liu
kubens-第三方工具
kubens 安装
root@master30 ~ 09:23:51# wget http://192.168.46.200/class/course-materials/softwares/stage03/kubens -O /usr/local/bin/kubens
--2026-08-06 09:24:01-- http://192.168.46.200/class/course-materials/softwares/stage03/kubens
Connecting to 192.168.46.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5703 (5.6K) [application/octet-stream]
Saving to: ‘/usr/local/bin/kubens’
/usr/local/bin/kubens 100%[==============================================>] 5.57K --.-KB/s in 0s
2026-08-06 09:24:01 (1.35 GB/s) - ‘/usr/local/bin/kubens’ saved [5703/5703]
root@master30 ~ 09:24:01# chmod +x /usr/local/bin/kubens
# 配置补全
root@master30 ~ 09:24:12# wget http://192.168.46.200/class/course-materials/softwares/stage03/kubens.bash -O /etc/bash_completion.d/kubens.bash
--2026-08-06 09:24:23-- http://192.168.46.200/class/course-materials/softwares/stage03/kubens.bash
Connecting to 192.168.46.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 254 [application/octet-stream]
Saving to: ‘/etc/bash_completion.d/kubens.bash’
/etc/bash_completion.d/kubens 100%[==============================================>] 254 --.-KB/s in 0s
2026-08-06 09:24:23 (58.4 MB/s) - ‘/etc/bash_completion.d/kubens.bash’ saved [254/254]
root@master30 ~ 09:24:23# source /etc/bash_completion.d/kubens.bash
kubens 常用操作命令
root@master30 ~ 09:24:44# kubens
default
kube-node-lease
kube-public
kube-system
liu
root@master30 ~ 09:24:51# kubens kube-system
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "kube-system".
root@master30 ~ 09:25:04# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin kube-system
root@master30 ~ 09:25:18# kubectl get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-585df69d45-p5fsp 1/1 Running 1 (25m ago) 17h
calico-node-7plmg 1/1 Running 1 (25m ago) 17h
calico-node-k5hk6 1/1 Running 1 (25m ago) 17h
calico-node-ql64b 1/1 Running 1 (25m ago) 17h
coredns-7db6d8ff4d-4l7rh 1/1 Running 1 (25m ago) 17h
coredns-7db6d8ff4d-b4pn5 1/1 Running 1 (25m ago) 17h
etcd-master30.liu.cloud 1/1 Running 1 (25m ago) 17h
kube-apiserver-master30.liu.cloud 1/1 Running 1 (25m ago) 17h
kube-controller-manager-master30.liu.cloud 1/1 Running 1 (25m ago) 17h
kube-proxy-dnl6s 1/1 Running 1 (25m ago) 17h
kube-proxy-glbf6 1/1 Running 1 (25m ago) 17h
kube-proxy-s7bpm 1/1 Running 1 (25m ago) 17h
kube-scheduler-master30.liu.cloud 1/1 Running 1 (25m ago) 17h
自定义脚本
#!/bin/bash
function usage(){
echo "$0 [namespace]
1. 未传入命名空间参数时,打印集群全部命名空间列表
2. 传入的命名空间必须是集群内已存在的资源"
}
# 获取当前上下文绑定的命名空间
namespace=$(kubectl config get-contexts | awk '/\*/{print $5}')
if [ -z "$namespace" ];then
namespace=default
fi
# 展示命名空间列表
if [ $# -eq 0 ];then
kubectl get ns | awk '{print " "$1}' | sed "s/^ $namespace/\* $namespace/"
exit 1
fi
# 切换指定命名空间
if [ $# -eq 1 ];then
if kubectl get ns | awk '$1 !~ "NAME" {print $1}' | grep -qx "$1" &>/dev/null;then
kubectl config set-context --current --namespace $1 > /dev/null
echo "当前命名空间已切换为:$1"
else
usage
fi
fi
Cluster 切换
~/.kube/config 详解
单集群配置
查看凭据配置文件内容(敏感数据自动隐藏):
root@master30 ~ 18:43:39# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.30:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: kube-system
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
完整配置文件示例:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJZVRSVHJQVXhFWEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHpOakE0TURJd056VXpNalphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURONHovN1NONzBDYUNjanhOYTdzQ2JTeU5XY3JSSVZBMWFUK0VKaGduMlphRWc5WVBBa3J6eUp3T0QKNWJtbFdVaTRZMTV3Vnlvc0NsN2xWdFBXcllKUVhkQncvWGlzUFNJcFkvQzRxcFR5RkgzQm5DYlJOeUlyaHFtLwp1SDNqSVBBMFYwOVVSbysxTStYNStKNzMvZ1RsSXFNc1BpZXJzNGNqMGEzNDhhL1VVUXhqdW53YW5uZlZENVRDCjV3cExLNnZmYkJQTjJScGw4NTM4b0R3RldweG1yQ1FoODNqRFpCSDRSbTFqbGpxc0Z3WVNudkZRS1RJd1dKRnMKd3pIdWNtUjZYcU96dGpiNjJZYnBjWlBHYkVrYXduYklOb20xOE80VXRTc1E0bk1MSHEwdTFqeDNOUDh2SmVJZwpISy9JaFA4TS80NHBqN1ZCNnpXY0pydzRWT3FMQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRVWJjdG0rWUd6bjZlS21CTWNQYU5GV0lCWW1qQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQU81b01PSEZyNwp3QmhGNnFTNmtwbHo3WVphV3dqVHdISmVKMm1zdzFaNFV3aHFKYlhLWThyREhHRXk3L0YwRUpVNTZWZVdYVVlxCnZGNDROWFRGeG00czU0bEsrUlE5K3RzTmM0VHh3cHNoTU9EUVNFM1NTSWNJN25jUGpER2xINm83UjVGOEk5WHUKWXJQRmE2Z1N2aXcrUTY1Zk94VlJ2dnhOblFndzR0TzQ1eWxZMFB0S1RyNm5RRW95WDNjWnhRbk1SMkczdE5IcAo0NkZIODZUbFdMTUpEbDVGVkY5aDcrekFnMC9yS0h5V0N2bUxGd050R2J2NEJGclc3MFo5STgxYURha0VUczkxCjN3aGFxa2tweXdUYnpQcC9yc3V2Q3Npb0hBWERlcUJtZldGYUR0SUc3bmV2MXlhNXdHM3RXcEdvN1AxTnNhWVEKK1NOUS9DQWlnaG5qCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.1.8.30:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: kube-system
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJZnROelNrckpMTG93RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHlOekE0TURVd056VXpNamRhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDKytLeHcKWWtjNXZWb2NicmJ5Z09EaWorc1lockxaTkwwODJNRGdkKzMvazZONXFpUlcySzB4MWlSRlNxd1FuQXlyR2RBeAozK3ByTlBHVmordkRZMjhjUnZiRzMvUDBRSytmaU9qNUpOQmY1WkJ1V3ZvZDRJT2ZPbGlvYlZPSWN6M1cyU294ClFFZTkrUHFFQzh0aXUrVHZ4VEdjRE1UMTYweXlZd2MwOHhyL2RZNzhGRW4rM1BweUFLRGZoNlVldXcvS0V5TmYKSUpKUW1TbTdFL2pHd3pMTWFpVzZmbkltTEhyYXdvZTJuc1lCclkvR210NkxQODZJdy9NS0RwMjgvSmxTWVhQTwpZQkdCbzRiSDR2aHZDLzN0SkcwUzQ3empQSlhSYTBiK0piS0czVzRTQ2ZnMzBhR2FqZVozVldkcVYxSkVaWDlLCnhySVV6R2l5YWlPa1ViMkRBZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkJSdHkyYjVnYk9mcDRxWQpFeHc5bzBWWWdGaWFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNJam40MGV6WEhxZnZ1VmlFMDJmZTJkNTVQCmNxb2JBSmM2cXU5WVB4SFdKZE00WEhHaXdEVGpDZll4dzRmQ3J6OFVNZGFIRFJoWkQ4eWoydXVBWWtWWmJrV1UKbTRGUytVeEZ3TGlCRU1aRFozN1drRTZ5QmEwWC9VSWFvUU9EaDhBdGxwMDJMaUJ2dTZ5bUdyQk85WEU2SUh3dAo5elRuVXVJWXpJZER4REhPQ1JUQWRXNk1qVHplNytZVExZVTlzVmFWL0tKV1VwUllGQWt3MUxkSjVCZDllcHM5CnpSazdOaVZvYk9KUUk3R1VUYUxSUnB3UUk0N0Z5TTV3OEhCcXZiclkyaytScjVrSGM4K0VpMUZsbXBqOG1Zb2QKa3I5QkRINFllbjJlOU5LN1lpakl5bXlwOHNNWGc3OGJacjdFYUR1RUw5NlBNVUpISS9sWWhDUktZQ05kCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdnZpc2NHSkhPYjFhSEc2MjhvRGc0by9yR0lheTJUUzlQTmpBNEhmdC81T2plYW9rClZ0aXRNZFlrUlVxc0VKd01xeG5RTWQvcWF6VHhsWS9ydzJOdkhFYjJ4dC96OUVDdm40am8rU1RRWCtXUWJscjYKSGVDRG56cFlxRzFUaUhNOTF0a3FNVUJIdmZqNmhBdkxZcnZrNzhVeG5BekU5ZXRNc21NSE5QTWEvM1dPL0JSSgovdHo2Y2dDZzM0ZWxIcnNQeWhNalh5Q1NVSmtwdXhQNHhzTXl6R29sdW41eUppeDYyc0tIdHA3R0FhMlB4cHJlCml6L09pTVB6Q2c2ZHZQeVpVbUZ6em1BUmdhT0d4K0w0Ynd2OTdTUnRFdU84NHp5VjBXdEcvaVd5aHQxdUVnbjQKTjlHaG1vM21kMVZuYWxkU1JHVi9Tc2F5Rk14b3Ntb2pwRkc5Z3dJREFRQUJBb0lCQUZYY0JlTk5QRXFvYUZBcQpNdFNhdndEOXhhdzBPMHJPbkZvejladTJMK25kWGYxQVVyQTlJTGtzVndoVVIwSDhkdkdpWEdsZ0M4d0JkTEJTCmthUTZHMlZ5UGxjeHIwUGNwVmtydTlyd0EwTnFPZUp6d3NvVisvZGx5eUNHYnEwRmF3TWloZ2E0cU1pdm5Tb3IKQjFrdnN3RmQvaXp6ek1YbjhZYXVZVG9jSnNJOU9JS3BNTUJtK3Fhd0VmcHRtYTJsaURVYVRiYXppY1o1NmlQeQpDblkrZTluZEh1MzJTUUw3OFVEcFN6ZjY2dnhnSGpQNTFHRXY2Y3h3NUphMzFycEd6MHBaY2xxbXFKMDJYQ251CkFoVDlwQzlVUmRUeFdEMDJSdVhuS0w0c2JqaVp6Wk1MZHdiSS9UYVhnbHZLNDRPM3p1VmJ0bExTM0ozdnNZV24KSWVKVmQva0NnWUVBMU9qYjAwTDdGNlpGMnB4b1J4T3NmL3BTL01BdURBMWMrUmVNdWpUdDROemxsZWcwOVpKQgpsRkpySE9CVkQ5Vmt1T2E3eFpQN2JTaG02b216bkxhRGwzQVhVRzEyVFFvVkxtNWZuYTY0Snl3ZTU0ZVExem9mCkpYVmUvbGpsWlJXSkY4RVZYQUYwQkRBYzlBVm0yNE9OcWFTaEl6L0hMS01pWC9Bak9nS3hXRlVDZ1lFQTVaOHEKU2lZei81TUQxQkJEMlRiM01Rc0NSUzF4Q2ZvTU8rclpTTVJvZjZSQVpUamI1Sm1rdjlQZEo2R0JaMXZ1SElLYwplejljSUNSTG5PcjVhZGJ4Y3E2emJ4aVZTZitMall1aVh4emduUXYyYi9waWJoOWJvT3pxYi9VQ0RtaXpwNXJrCmN3dU85S1FaVi9jRVE3Yk1zYnBiUnhMUTR6RTJQZG1VK3hVQTluY0NnWUVBdkJmRUxNMmQyblRRZmFOMEZHYnoKSEZUZi85OGdUeEYzTTdCMGFRVGRxcXc4UDhWWEZDUlR2MTlZdGJnU0xkek9FUFAycTBSaStUcWFRVlhKMGdjRQpGa08ydFIwZlNFeENEalVBVCtQTldQNEhoM0FpcTZIelpqcGM0OE5SVlk1REFUTlpWV0VMUjYvaHhFc0paYURCCkJFQW5BMmNTNVFKeUdlT2ltMXRKcGNrQ2dZQjJZdXFOMGthSzVVUmJDSXZDcVFrbld2S3ZzZThPNHNGOS91WksKRXlHQmRiRFJ2MC8zKzVNcVo5UWxBNnJSSEYrV2lXeWVTcHQzNHQ2dEo2U3lBZVQ0YU1RUWFrOUdHSi9kdVhsYwpxbW5QN29QL1ZjdDcxV1VMZ2pxWXdHeHYrMkZzNzNvTEtwRm81bFkrdVJlVXhlR2hYR0NGTTFsSldXMEsxR3h3ClMzTDBud0tCZ0hKVEo4bUQxcFRwUGgxaVEwakc2THliem9MeVU2UHBmZmpya2JJY3VCa0xBYjhkclJudzVPWEIKWE5pTmF1Q1orZ0pkQVFtRGlCVitQNTVqamhRSzVqSzVOQXE4dTNoaEpJcVNWQWIwREwyTmJlcTRKeEJTbDgyTApObnZVRTNOdWJ0c0VvdVVjMXMxTVZFa1FLaktqdXVQS1cwa1h1Vndwa0hIL1Q2VFhsbktzCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
多集群配置
示例文件路径:/root/multi-cluster-config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.30:6443
name: kubernetes-1
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.30:6443
name: kubernetes-2
contexts:
- context:
cluster: kubernetes-1
namespace: default
user: kubernetes-1-admin
name: kubernetes-1-admin@kubernetes-1
- context:
cluster: kubernetes-2
namespace: webapp
user: kubernetes-2-admin
name: kubernetes-2-admin@kubernetes-2
current-context: kubernetes-1-admin@kubernetes-1
kind: Config
preferences: {}
users:
- name: kubernetes-1-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
- name: kubernetes-2-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
配置文件包含三类核心资源定义:
- clusters:集群信息,包含集群标识、根证书、API 服务地址与端口。
- users:用户身份信息,包含用户名、客户端证书与私钥。
- contexts:上下文关联信息,绑定上下文名称、目标集群、操作用户以及默认命名空间。
多集群切换
kubernetes 自带工具
环境配置操作:
root@master30 ~ 18:35:28# vim .kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJZVRSVHJQVXhFWEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHpOakE0TURJd056VXpNalphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURONHovN1NONzBDYUNjanhOYTdzQ2JTeU5XY3JSSVZBMWFUK0VKaGduMlphRWc5WVBBa3J6eUp3T0QKNWJtbFdVaTRZMTV3Vnlvc0NsN2xWdFBXcllKUVhkQncvWGlzUFNJcFkvQzRxcFR5RkgzQm5DYlJOeUlyaHFtLwp1SDNqSVBBMFYwOVVSbysxTStYNStKNzMvZ1RsSXFNc1BpZXJzNGNqMGEzNDhhL1VVUXhqdW53YW5uZlZENVRDCjV3cExLNnZmYkJQTjJScGw4NTM4b0R3RldweG1yQ1FoODNqRFpCSDRSbTFqbGpxc0Z3WVNudkZRS1RJd1dKRnMKd3pIdWNtUjZYcU96dGpiNjJZYnBjWlBHYkVrYXduYklOb20xOE80VXRTc1E0bk1MSHEwdTFqeDNOUDh2SmVJZwpISy9JaFA4TS80NHBqN1ZCNnpXY0pydzRWT3FMQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRVWJjdG0rWUd6bjZlS21CTWNQYU5GV0lCWW1qQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQU81b01PSEZyNwp3QmhGNnFTNmtwbHo3WVphV3dqVHdISmVKMm1zdzFaNFV3aHFKYlhLWThyREhHRXk3L0YwRUpVNTZWZVdYVVlxCnZGNDROWFRGeG00czU0bEsrUlE5K3RzTmM0VHh3cHNoTU9EUVNFM1NTSWNJN25jUGpER2xINm83UjVGOEk5WHUKWXJQRmE2Z1N2aXcrUTY1Zk94VlJ2dnhOblFndzR0TzQ1eWxZMFB0S1RyNm5RRW95WDNjWnhRbk1SMkczdE5IcAo0NkZIODZUbFdMTUpEbDVGVkY5aDcrekFnMC9yS0h5V0N2bUxGd050R2J2NEJGclc3MFo5STgxYURha0VUczkxCjN3aGFxa2tweXdUYnpQcC9yc3V2Q3Npb0hBWERlcUJtZldGYUR0SUc3bmV2MXlhNXdHM3RXcEdvN1AxTnNhWVEKK1NOUS9DQWlnaG5qCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.1.8.30:6443
name: kubernetes-1
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJZVRSVHJQVXhFWEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHpOakE0TURJd056VXpNalphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURONHovN1NONzBDYUNjanhOYTdzQ2JTeU5XY3JSSVZBMWFUK0VKaGduMlphRWc5WVBBa3J6eUp3T0QKNWJtbFdVaTRZMTV3Vnlvc0NsN2xWdFBXcllKUVhkQncvWGlzUFNJcFkvQzRxcFR5RkgzQm5DYlJOeUlyaHFtLwp1SDNqSVBBMFYwOVVSbysxTStYNStKNzMvZ1RsSXFNc1BpZXJzNGNqMGEzNDhhL1VVUXhqdW53YW5uZlZENVRDCjV3cExLNnZmYkJQTjJScGw4NTM4b0R3RldweG1yQ1FoODNqRFpCSDRSbTFqbGpxc0Z3WVNudkZRS1RJd1dKRnMKd3pIdWNtUjZYcU96dGpiNjJZYnBjWlBHYkVrYXduYklOb20xOE80VXRTc1E0bk1MSHEwdTFqeDNOUDh2SmVJZwpISy9JaFA4TS80NHBqN1ZCNnpXY0pydzRWT3FMQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRVWJjdG0rWUd6bjZlS21CTWNQYU5GV0lCWW1qQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQU81b01PSEZyNwp3QmhGNnFTNmtwbHo3WVphV3dqVHdISmVKMm1zdzFaNFV3aHFKYlhLWThyREhHRXk3L0YwRUpVNTZWZVdYVVlxCnZGNDROWFRGeG00czU0bEsrUlE5K3RzTmM0VHh3cHNoTU9EUVNFM1NTSWNJN25jUGpER2xINm83UjVGOEk5WHUKWXJQRmE2Z1N2aXcrUTY1Zk94VlJ2dnhOblFndzR0TzQ1eWxZMFB0S1RyNm5RRW95WDNjWnhRbk1SMkczdE5IcAo0NkZIODZUbFdMTUpEbDVGVkY5aDcrekFnMC9yS0h5V0N2bUxGd050R2J2NEJGclc3MFo5STgxYURha0VUczkxCjN3aGFxa2tweXdUYnpQcC9yc3V2Q3Npb0hBWERlcUJtZldGYUR0SUc3bmV2MXlhNXdHM3RXcEdvN1AxTnNhWVEKK1NOUS9DQWlnaG5qCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://10.1.8.30:6443
name: kubernetes-2
contexts:
- context:
cluster: kubernetes-1
namespace: default
user: kubernetes-1-admin
name: kubernetes-1-admin@kubernetes-1
- context:
cluster: kubernetes-2
namespace: webapp
user: kubernetes-2-admin
name: kubernetes-2-admin@kubernetes-2
current-context: kubernetes-1-admin@kubernetes-1
kind: Config
preferences: {}
users:
- name: kubernetes-1-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJZnROelNrckpMTG93RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHlOekE0TURVd056VXpNamRhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDKytLeHcKWWtjNXZWb2NicmJ5Z09EaWorc1lockxaTkwwODJNRGdkKzMvazZONXFpUlcySzB4MWlSRlNxd1FuQXlyR2RBeAozK3ByTlBHVmordkRZMjhjUnZiRzMvUDBRSytmaU9qNUpOQmY1WkJ1V3ZvZDRJT2ZPbGlvYlZPSWN6M1cyU294ClFFZTkrUHFFQzh0aXUrVHZ4VEdjRE1UMTYweXlZd2MwOHhyL2RZNzhGRW4rM1BweUFLRGZoNlVldXcvS0V5TmYKSUpKUW1TbTdFL2pHd3pMTWFpVzZmbkltTEhyYXdvZTJuc1lCclkvR210NkxQODZJdy9NS0RwMjgvSmxTWVhQTwpZQkdCbzRiSDR2aHZDLzN0SkcwUzQ3empQSlhSYTBiK0piS0czVzRTQ2ZnMzBhR2FqZVozVldkcVYxSkVaWDlLCnhySVV6R2l5YWlPa1ViMkRBZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkJSdHkyYjVnYk9mcDRxWQpFeHc5bzBWWWdGaWFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNJam40MGV6WEhxZnZ1VmlFMDJmZTJkNTVQCmNxb2JBSmM2cXU5WVB4SFdKZE00WEhHaXdEVGpDZll4dzRmQ3J6OFVNZGFIRFJoWkQ4eWoydXVBWWtWWmJrV1UKbTRGUytVeEZ3TGlCRU1aRFozN1drRTZ5QmEwWC9VSWFvUU9EaDhBdGxwMDJMaUJ2dTZ5bUdyQk85WEU2SUh3dAo5elRuVXVJWXpJZER4REhPQ1JUQWRXNk1qVHplNytZVExZVTlzVmFWL0tKV1VwUllGQWt3MUxkSjVCZDllcHM5CnpSazdOaVZvYk9KUUk3R1VUYUxSUnB3UUk0N0Z5TTV3OEhCcXZiclkyaytScjVrSGM4K0VpMUZsbXBqOG1Zb2QKa3I5QkRINFllbjJlOU5LN1lpakl5bXlwOHNNWGc3OGJacjdFYUR1RUw5NlBNVUpISS9sWWhDUktZQ05kCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdnZpc2NHSkhPYjFhSEc2MjhvRGc0by9yR0lheTJUUzlQTmpBNEhmdC81T2plYW9rClZ0aXRNZFlrUlVxc0VKd01xeG5RTWQvcWF6VHhsWS9ydzJOdkhFYjJ4dC96OUVDdm40am8rU1RRWCtXUWJscjYKSGVDRG56cFlxRzFUaUhNOTF0a3FNVUJIdmZqNmhBdkxZcnZrNzhVeG5BekU5ZXRNc21NSE5QTWEvM1dPL0JSSgovdHo2Y2dDZzM0ZWxIcnNQeWhNalh5Q1NVSmtwdXhQNHhzTXl6R29sdW41eUppeDYyc0tIdHA3R0FhMlB4cHJlCml6L09pTVB6Q2c2ZHZQeVpVbUZ6em1BUmdhT0d4K0w0Ynd2OTdTUnRFdU84NHp5VjBXdEcvaVd5aHQxdUVnbjQKTjlHaG1vM21kMVZuYWxkU1JHVi9Tc2F5Rk14b3Ntb2pwRkc5Z3dJREFRQUJBb0lCQUZYY0JlTk5QRXFvYUZBcQpNdFNhdndEOXhhdzBPMHJPbkZvejladTJMK25kWGYxQVVyQTlJTGtzVndoVVIwSDhkdkdpWEdsZ0M4d0JkTEJTCmthUTZHMlZ5UGxjeHIwUGNwVmtydTlyd0EwTnFPZUp6d3NvVisvZGx5eUNHYnEwRmF3TWloZ2E0cU1pdm5Tb3IKQjFrdnN3RmQvaXp6ek1YbjhZYXVZVG9jSnNJOU9JS3BNTUJtK3Fhd0VmcHRtYTJsaURVYVRiYXppY1o1NmlQeQpDblkrZTluZEh1MzJTUUw3OFVEcFN6ZjY2dnhnSGpQNTFHRXY2Y3h3NUphMzFycEd6MHBaY2xxbXFKMDJYQ251CkFoVDlwQzlVUmRUeFdEMDJSdVhuS0w0c2JqaVp6Wk1MZHdiSS9UYVhnbHZLNDRPM3p1VmJ0bExTM0ozdnNZV24KSWVKVmQva0NnWUVBMU9qYjAwTDdGNlpGMnB4b1J4T3NmL3BTL01BdURBMWMrUmVNdWpUdDROemxsZWcwOVpKQgpsRkpySE9CVkQ5Vmt1T2E3eFpQN2JTaG02b216bkxhRGwzQVhVRzEyVFFvVkxtNWZuYTY0Snl3ZTU0ZVExem9mCkpYVmUvbGpsWlJXSkY4RVZYQUYwQkRBYzlBVm0yNE9OcWFTaEl6L0hMS01pWC9Bak9nS3hXRlVDZ1lFQTVaOHEKU2lZei81TUQxQkJEMlRiM01Rc0NSUzF4Q2ZvTU8rclpTTVJvZjZSQVpUamI1Sm1rdjlQZEo2R0JaMXZ1SElLYwplejljSUNSTG5PcjVhZGJ4Y3E2emJ4aVZTZitMall1aVh4emduUXYyYi9waWJoOWJvT3pxYi9VQ0RtaXpwNXJrCmN3dU85S1FaVi9jRVE3Yk1zYnBiUnhMUTR6RTJQZG1VK3hVQTluY0NnWUVBdkJmRUxNMmQyblRRZmFOMEZHYnoKSEZUZi85OGdUeEYzTTdCMGFRVGRxcXc4UDhWWEZDUlR2MTlZdGJnU0xkek9FUFAycTBSaStUcWFRVlhKMGdjRQpGa08ydFIwZlNFeENEalVBVCtQTldQNEhoM0FpcTZIelpqcGM0OE5SVlk1REFUTlpWV0VMUjYvaHhFc0paYURCCkJFQW5BMmNTNVFKeUdlT2ltMXRKcGNrQ2dZQjJZdXFOMGthSzVVUmJDSXZDcVFrbld2S3ZzZThPNHNGOS91WksKRXlHQmRiRFJ2MC8zKzVNcVo5UWxBNnJSSEYrV2lXeWVTcHQzNHQ2dEo2U3lBZVQ0YU1RUWFrOUdHSi9kdVhsYwpxbW5QN29QL1ZjdDcxV1VMZ2pxWXdHeHYrMkZzNzNvTEtwRm81bFkrdVJlVXhlR2hYR0NGTTFsSldXMEsxR3h3ClMzTDBud0tCZ0hKVEo4bUQxcFRwUGgxaVEwakc2THliem9MeVU2UHBmZmpya2JJY3VCa0xBYjhkclJudzVPWEIKWE5pTmF1Q1orZ0pkQVFtRGlCVitQNTVqamhRSzVqSzVOQXE4dTNoaEpJcVNWQWIwREwyTmJlcTRKeEJTbDgyTApObnZVRTNOdWJ0c0VvdVVjMXMxTVZFa1FLaktqdXVQS1cwa1h1Vndwa0hIL1Q2VFhsbktzCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
- name: kubernetes-2-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJZnROelNrckpMTG93RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBNE1EVXdOelE0TWpaYUZ3MHlOekE0TURVd056VXpNamRhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDKytLeHcKWWtjNXZWb2NicmJ5Z09EaWorc1lockxaTkwwODJNRGdkKzMvazZONXFpUlcySzB4MWlSRlNxd1FuQXlyR2RBeAozK3ByTlBHVmordkRZMjhjUnZiRzMvUDBRSytmaU9qNUpOQmY1WkJ1V3ZvZDRJT2ZPbGlvYlZPSWN6M1cyU294ClFFZTkrUHFFQzh0aXUrVHZ4VEdjRE1UMTYweXlZd2MwOHhyL2RZNzhGRW4rM1BweUFLRGZoNlVldXcvS0V5TmYKSUpKUW1TbTdFL2pHd3pMTWFpVzZmbkltTEhyYXdvZTJuc1lCclkvR210NkxQODZJdy9NS0RwMjgvSmxTWVhQTwpZQkdCbzRiSDR2aHZDLzN0SkcwUzQ3empQSlhSYTBiK0piS0czVzRTQ2ZnMzBhR2FqZVozVldkcVYxSkVaWDlLCnhySVV6R2l5YWlPa1ViMkRBZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRkJSdHkyYjVnYk9mcDRxWQpFeHc5bzBWWWdGaWFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNJam40MGV6WEhxZnZ1VmlFMDJmZTJkNTVQCmNxb2JBSmM2cXU5WVB4SFdKZE00WEhHaXdEVGpDZll4dzRmQ3J6OFVNZGFIRFJoWkQ4eWoydXVBWWtWWmJrV1UKbTRGUytVeEZ3TGlCRU1aRFozN1drRTZ5QmEwWC9VSWFvUU9EaDhBdGxwMDJMaUJ2dTZ5bUdyQk85WEU2SUh3dAo5elRuVXVJWXpJZER4REhPQ1JUQWRXNk1qVHplNytZVExZVTlzVmFWL0tKV1VwUllGQWt3MUxkSjVCZDllcHM5CnpSazdOaVZvYk9KUUk3R1VUYUxSUnB3UUk0N0Z5TTV3OEhCcXZiclkyaytScjVrSGM4K0VpMUZsbXBqOG1Zb2QKa3I5QkRINFllbjJlOU5LN1lpakl5bXlwOHNNWGc3OGJacjdFYUR1RUw5NlBNVUpISS9sWWhDUktZQ05kCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBdnZpc2NHSkhPYjFhSEc2MjhvRGc0by9yR0lheTJUUzlQTmpBNEhmdC81T2plYW9rClZ0aXRNZFlrUlVxc0VKd01xeG5RTWQvcWF6VHhsWS9ydzJOdkhFYjJ4dC96OUVDdm40am8rU1RRWCtXUWJscjYKSGVDRG56cFlxRzFUaUhNOTF0a3FNVUJIdmZqNmhBdkxZcnZrNzhVeG5BekU5ZXRNc21NSE5QTWEvM1dPL0JSSgovdHo2Y2dDZzM0ZWxIcnNQeWhNalh5Q1NVSmtwdXhQNHhzTXl6R29sdW41eUppeDYyc0tIdHA3R0FhMlB4cHJlCml6L09pTVB6Q2c2ZHZQeVpVbUZ6em1BUmdhT0d4K0w0Ynd2OTdTUnRFdU84NHp5VjBXdEcvaVd5aHQxdUVnbjQKTjlHaG1vM21kMVZuYWxkU1JHVi9Tc2F5Rk14b3Ntb2pwRkc5Z3dJREFRQUJBb0lCQUZYY0JlTk5QRXFvYUZBcQpNdFNhdndEOXhhdzBPMHJPbkZvejladTJMK25kWGYxQVVyQTlJTGtzVndoVVIwSDhkdkdpWEdsZ0M4d0JkTEJTCmthUTZHMlZ5UGxjeHIwUGNwVmtydTlyd0EwTnFPZUp6d3NvVisvZGx5eUNHYnEwRmF3TWloZ2E0cU1pdm5Tb3IKQjFrdnN3RmQvaXp6ek1YbjhZYXVZVG9jSnNJOU9JS3BNTUJtK3Fhd0VmcHRtYTJsaURVYVRiYXppY1o1NmlQeQpDblkrZTluZEh1MzJTUUw3OFVEcFN6ZjY2dnhnSGpQNTFHRXY2Y3h3NUphMzFycEd6MHBaY2xxbXFKMDJYQ251CkFoVDlwQzlVUmRUeFdEMDJSdVhuS0w0c2JqaVp6Wk1MZHdiSS9UYVhnbHZLNDRPM3p1VmJ0bExTM0ozdnNZV24KSWVKVmQva0NnWUVBMU9qYjAwTDdGNlpGMnB4b1J4T3NmL3BTL01BdURBMWMrUmVNdWpUdDROemxsZWcwOVpKQgpsRkpySE9CVkQ5Vmt1T2E3eFpQN2JTaG02b216bkxhRGwzQVhVRzEyVFFvVkxtNWZuYTY0Snl3ZTU0ZVExem9mCkpYVmUvbGpsWlJXSkY4RVZYQUYwQkRBYzlBVm0yNE9OcWFTaEl6L0hMS01pWC9Bak9nS3hXRlVDZ1lFQTVaOHEKU2lZei81TUQxQkJEMlRiM01Rc0NSUzF4Q2ZvTU8rclpTTVJvZjZSQVpUamI1Sm1rdjlQZEo2R0JaMXZ1SElLYwplejljSUNSTG5PcjVhZGJ4Y3E2emJ4aVZTZitMall1aVh4emduUXYyYi9waWJoOWJvT3pxYi9VQ0RtaXpwNXJrCmN3dU85S1FaVi9jRVE3Yk1zYnBiUnhMUTR6RTJQZG1VK3hVQTluY0NnWUVBdkJmRUxNMmQyblRRZmFOMEZHYnoKSEZUZi85OGdUeEYzTTdCMGFRVGRxcXc4UDhWWEZDUlR2MTlZdGJnU0xkek9FUFAycTBSaStUcWFRVlhKMGdjRQpGa08ydFIwZlNFeENEalVBVCtQTldQNEhoM0FpcTZIelpqcGM0OE5SVlk1REFUTlpWV0VMUjYvaHhFc0paYURCCkJFQW5BMmNTNVFKeUdlT2ltMXRKcGNrQ2dZQjJZdXFOMGthSzVVUmJDSXZDcVFrbld2S3ZzZThPNHNGOS91WksKRXlHQmRiRFJ2MC8zKzVNcVo5UWxBNnJSSEYrV2lXeWVTcHQzNHQ2dEo2U3lBZVQ0YU1RUWFrOUdHSi9kdVhsYwpxbW5QN29QL1ZjdDcxV1VMZ2pxWXdHeHYrMkZzNzNvTEtwRm81bFkrdVJlVXhlR2hYR0NGTTFsSldXMEsxR3h3ClMzTDBud0tCZ0hKVEo4bUQxcFRwUGgxaVEwakc2THliem9MeVU2UHBmZmpya2JJY3VCa0xBYjhkclJudzVPWEIKWE5pTmF1Q1orZ0pkQVFtRGlCVitQNTVqamhRSzVqSzVOQXE4dTNoaEpJcVNWQWIwREwyTmJlcTRKeEJTbDgyTApObnZVRTNOdWJ0c0VvdVVjMXMxTVZFa1FLaktqdXVQS1cwa1h1Vndwa0hIL1Q2VFhsbktzCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
查看集群列表
root@master30 ~ 18:38:30# kubectl config get-clusters
NAME
kubernetes-2
kubernetes-1
查看上下文列表
root@master30 ~ 18:39:24# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-1-admin@kubernetes-1 kubernetes-1 kubernetes-1-admin default
kubernetes-2-admin@kubernetes-2 kubernetes-2 kubernetes-2-admin webapp
列表中*标记代表当前正在使用的上下文。
切换上下文
root@master30 ~ 18:39:38# kubectl config use-context kubernetes-2-admin@kubernetes-2
Switched to context "kubernetes-2-admin@kubernetes-2".
root@master30 ~ 18:40:28# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kubernetes-1-admin@kubernetes-1 kubernetes-1 kubernetes-1-admin default
* kubernetes-2-admin@kubernetes-2 kubernetes-2 kubernetes-2-admin webapp
kubectx - 第三方工具
kubectx 安装步骤
root@master30 ~ 18:50:27# wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.zip
root@master30 ~ 18:51:22# unzip kubectx.zip
root@master30 ~ 18:51:31# ls kubectx-master/
CONTRIBUTING.md LICENSE README.md cmd completion go.mod go.sum img internal kubectx kubens test
root@master30 ~ 18:51:51# cp kubectx-master/kubectx /usr/local/bin/
root@master30 ~ 18:52:26# chmod +x /usr/local/bin/kubectx
# 配置命令自动补全
root@master30 ~ 18:52:41# cp kubectx-master/completion/kubectx.bash /etc/bash_completion.d/
root@master30 ~ 18:53:00# source /etc/bash_completion.d/kubectx.bash
kubectx 帮助文档
root@master30 ~ 18:53:23# kubectx -h
Manage and switch between kubectl contexts.
USAGE:
kubectx : list the contexts
kubectx <NAME> : switch to context <NAME>
kubectx - : switch to the previous context
kubectx -c, --current : show the current context name
kubectx <NEW_NAME>=<NAME> : rename context <NAME> to <NEW_NAME>
kubectx <NEW_NAME>=. : rename current-context to <NEW_NAME>
kubectx -d <NAME> [<NAME...>] : delete context <NAME> ('.' for current-context)
(this command won't delete the user/cluster entry
that is used by the context)
kubectx -u, --unset : unset the current context
kubectx -h,--help : show this message
(This executable is the legacy bash-based implementation, consider upgrading to Go-based implementation.)
kubectx 常用操作命令
root@master30 ~ 18:53:38# kubectx
kubernetes-1-admin@kubernetes-1
kubernetes-2-admin@kubernetes-2
root@master30 ~ 18:53:58# kubectx -c
kubernetes-1-admin@kubernetes-1
root@master30 ~ 18:54:10# kubectx kubernetes-1-admin@kubernetes-1
Switched to context "kubernetes-1-admin@kubernetes-1".
root@master30 ~ 18:54:34# kubectx -c
kubernetes-1-admin@kubernetes-1
root@master30 ~ 18:54:51# kubectx -u
Unsetting current context.
Property "current-context" unset.
root@master30 ~ 18:55:09# kubectx -c
error: current-context is not set
Kubernetes Pod
学习参考:Pod
环境准备
root@master30 ~ 10:19:36# kubectl create ns pods
root@master30 ~ 10:20:04# kubectl config set-context --current --namespace pods
Pod 介绍
Pod 是 Kubernetes 中的基础调度单元,官方定义为:a single instance of an application in Kubernetes。
Kubernetes 通过定义 Pod 资源,并在其内部运行容器;容器需指定镜像,用于承载具体业务服务。Pod 代表集群中一组正在运行的进程,单个 Pod 可封装一个或多个容器,Pod 内所有容器共享存储、网络等核心资源。我们可以将 Pod 类比为一台独立虚拟机,而容器则是运行在这台虚拟机内部的业务进程。
- 单容器 Pod:将 Pod 视作单个容器的封装载体,Kubernetes 直接管理 Pod,而非底层容器。
- **多容器 Pod:**Pod 可封装一组协同工作的业务容器,这些容器会被调度至集群同一台物理机或虚拟机上运行。Pod 内部容器共享资源与依赖,支持相互通信,生命周期同步启停。Pod 将多容器、网络资源、存储资源封装为统一的可管理实体。同一 Pod 内所有容器共享网络与存储资源。
- 集群会为每个 Pod 分配唯一 IP 地址,Pod 内全部容器共用同一个网络命名空间,共享 IP 与端口空间,容器之间可通过 localhost直接通信;Pod 与集群内其他 Pod 通信时,则依托自身统一网络资源完成。Pod 可挂载多组数据卷,卷资源对 Pod 内所有容器可见。
通俗解释: 可以把 Pod 理解为一个豌豆荚,荚内的每一颗豌豆对应一个容器。同一豌豆荚内的豌豆共用水分、养分等资源,同理,Pod 内部所有容器共享 Pod 层面的网络、存储资源。

例如:web容器提供文件共享,另外一个容器负责更新文件内容。

pod 基本管理
创建 pod
# 空运行,只生成yaml文件
root@master30 ~ 10:25:18# kubectl run web --image=hub.liu.cloud/library/nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: web
name: web
spec:
containers:
- image: docker.io/library/nginx
name: web
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
# 直接创建pod
root@master30 ~ 10:38:01# kubectl run web --image=hub.liu.cloud/library/nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: web
name: web
spec:
containers:
- image: hub.laoma.cloud/library/nginx
name: web
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
root@master30 ~ 10:39:27# kubectl get pod
NAME READY STATUS RESTARTS AGE
web 1/1 Running 2 (43m ago) 17h
root@master30 ~ 10:40:25# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 2 (43m ago) 17h 10.224.133.67 worker31.liu.cloud <none> <none>
root@master30 ~ 10:40:43# ssh root@worker31 nerdctl ps --namespace k8s.io |grep web
1e705e3958eb docker.io/library/nginx:latest "/docker-entrypoint.…" 44 minutes ago Up k8s://liu/web/web
c04def71cc52 hub.laoma.cloud/kubernetes/pause:3.9 "/pause" 44 minutes ago Up k8s://liu/web
root@master30 ~ 10:41:35# ssh root@worker31 nerdctl images --namespace k8s.io |grep nginx
nginx latest 8541484afbc9 18 hours ago linux/amd64 166.5 MiB 60.2 MiB
nginx <none> 21f8c0e3416b 18 hours ago linux/amd64 166.5 MiB 60.2 MiB
nginx <none> 8541484afbc9 2 hours ago linux/amd64 166.5 MiB 60.2 MiB
查看 pod
# 以yaml格式查看pod
root@master30 ~ 10:41:53# kubectl get pod web -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: c04def71cc5254672d97d01ce807a1bfbd01eb3a98aa3fba1c72e5ff5525f0c7
cni.projectcalico.org/podIP: 10.224.133.67/32
cni.projectcalico.org/podIPs: 10.224.133.67/32
creationTimestamp: "2026-08-05T08:57:29Z"
labels:
run: web
name: web
namespace: liu
resourceVersion: "27513"
uid: 8ef41379-2057-4f6d-b612-3e93c0a9fc7e
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: web
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-srbzb
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: worker31.liu.cloud
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: kube-api-access-srbzb
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2026-08-06T01:57:24Z"
status: "True"
type: PodReadyToStartContainers
- lastProbeTime: null
lastTransitionTime: "2026-08-05T08:57:29Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2026-08-06T01:57:24Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2026-08-06T01:57:24Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2026-08-05T08:57:29Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://1e705e3958eb7df99b7785ce52b099304e554fc626e3e5f234c4846e966b0cf0
image: docker.io/library/nginx:latest
imageID: docker.io/library/nginx@sha256:21f8c0e3416b84eeec895c80077da69e2d25938cb0fc4bcc6a2ea33699b75703
lastState:
terminated:
containerID: containerd://2765385237f1b8245f3aa0eaea7e94d66549039849eacdd786f2f343ad2310d8
exitCode: 255
finishedAt: "2026-08-06T01:56:47Z"
reason: Unknown
startedAt: "2026-08-06T01:00:27Z"
name: web
ready: true
restartCount: 2
started: true
state:
running:
startedAt: "2026-08-06T01:57:24Z"
hostIP: 10.1.8.31
hostIPs:
- ip: 10.1.8.31
phase: Running
podIP: 10.224.133.67
podIPs:
- ip: 10.224.133.67
qosClass: BestEffort
startTime: "2026-08-05T08:57:29Z"
# 查看pod
root@master30 ~ 10:42:15# kubectl describe pod web
Name: web
Namespace: liu
Priority: 0
Service Account: default
Node: worker31.liu.cloud/10.1.8.31
Start Time: Wed, 05 Aug 2026 16:57:29 +0800
Labels: run=web
Annotations: cni.projectcalico.org/containerID: c04def71cc5254672d97d01ce807a1bfbd01eb3a98aa3fba1c72e5ff5525f0c7
cni.projectcalico.org/podIP: 10.224.133.67/32
cni.projectcalico.org/podIPs: 10.224.133.67/32
Status: Running
IP: 10.224.133.67
IPs:
IP: 10.224.133.67
Containers:
web:
Container ID: containerd://1e705e3958eb7df99b7785ce52b099304e554fc626e3e5f234c4846e966b0cf0
Image: nginx
Image ID: docker.io/library/nginx@sha256:21f8c0e3416b84eeec895c80077da69e2d25938cb0fc4bcc6a2ea33699b75703
Port: <none>
Host Port: <none>
State: Running
Started: Thu, 06 Aug 2026 09:57:24 +0800
Last State: Terminated
Reason: Unknown
Exit Code: 255
Started: Thu, 06 Aug 2026 09:00:27 +0800
Finished: Thu, 06 Aug 2026 09:56:47 +0800
Ready: True
Restart Count: 2
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-srbzb (ro)
Conditions:
Type Status
PodReadyToStartContainers True
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-srbzb:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SandboxChanged 102m (x2 over 102m) kubelet Pod sandbox changed, it will be killed and re-created.
Normal Pulling 102m kubelet Pulling image "nginx"
Normal Pulled 102m kubelet Successfully pulled image "nginx" in 6.199s (6.199s including waiting). Image size: 63135215 bytes.
Normal Created 102m kubelet Created container web
Normal Started 102m kubelet Started container web
Normal SandboxChanged 45m (x2 over 45m) kubelet Pod sandbox changed, it will be killed and re-created.
Normal Pulling 45m kubelet Pulling image "nginx"
Normal Pulled 45m kubelet Successfully pulled image "nginx" in 1.04s (1.04s including waiting). Image size: 63135215 bytes.
Normal Created 45m kubelet Created container web
Normal Started 45m kubelet Started container web
# 查看pod标准输出,可以是哟个选项-f动态查看pod输出
root@master30 ~ 10:42:29# kubectl logs -f web
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
编辑 pod
root@master30 ~ 10:42:47# kubectl edit pod web
提示:并不是所有属性都可以编辑,例如pod名称。如果非要编辑特定属性,可以先删除pod,然后修改pod对的yaml文件,重新创建。
pod 中执行命令
root@master30 ~ 10:43:49# kubectl exec web -- hostname
web
root@master30 ~ 10:44:16# kubectl exec web -- pwd
/
root@master30 ~ 10:46:20# kubectl exec web -- id
uid=0(root) gid=0(root) groups=0(root)
cp 文件给 pod
root@master30 ~ 10:46:25# kubectl cp /etc/hosts web:/new-hosts
root@master30 ~ 10:47:22# kubectl exec web -- ls /new-hosts
/new-hosts
删除 pod
root@master30 ~ 10:51:20# kubectl delete pod web
pod "web" deleted
删除时间
root@master30 ~ 10:51:40# kubectl get pod web -o yaml|grep 'terminationGracePeriodSeconds' terminationGracePeriodSeconds: 30
yaml 文件创建 pod
# web.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: web
name: web
spec:
containers:
- image: docker.io/library/nginx
name: web
root@master30 ~ 11:14:23# kubectl delete pod web
pod "web" deleted
# 或者
root@master30 ~ 11:14:35# kubectl apply -f web.yaml
综合实验:构建 wordpreess
- 创建 pod-mysql 数据库
- 创建 pod-wordpress 博客
参考步骤:
# 创建 pod-mysql 数据库
root@master30 ~ 11:15:25# kubectl run wordpress-db --image=hub.laoma.cloud/library/mysql --env MYSQL_ROOT_PASSWORD=123
pod/wordpress-db created
# 创建 pod-wordpress 博客
root@master30 ~ 11:16:09# kubectl run wordpress-app --image=hub.laoma.cloud/library/wordpress
pod/wordpress-app created
# 实现集群外访问集群内pod
root@master30 ~ 11:16:32# kubectl port-forward pods/wordpress-app --address 10.1.8.30 80:80
Forwarding from 10.1.8.30:80 -> 80
Handling connection for 80
...
# 该命令窗口不要关闭
# 查看 IP
root@master30 ~ 11:17:26# kubectl get pods -o wide | awk '{print $1" "$6}'
NAME IP
web 10.224.133.69
wordpress-app 10.224.133.70
wordpress-db 10.224.218.132
# 创建数据库
root@master30 ~ 11:20:07# kubectl exec -it wordpress-db -- mysql -uroot -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.6.0 MySQL Community Server - GPL
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database wordpress;
Query OK, 1 row affected (0.005 sec)
mysql> create user wordpress identified by '123';
Query OK, 0 rows affected (0.008 sec)
mysql> grant all privileges on wordpress.* to wordpress;
Query OK, 0 rows affected (0.003 sec)
mysql> flush privileges;
Query OK, 0 rows affected, 1 warning (0.004 sec)
访问web页面 http://10.1.8.30:80,配置站点。
多容器 pod
示例文件:blog.yaml
root@master30 ~ 11:30:26# vim pod-blog.yaml
apiVersion: v1
kind: Pod
metadata:
name: bbs
labels:
run: bbs
spec:
containers:
- image: hub.laoma.cloud/library/mysql:latest
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- name: MYSQL_USER
value: tom
- name: MYSQL_PASSWORD
value: "123"
- name: MYSQL_DATABASE
value: bbs
ports:
- containerPort: 3306
name: mysql
protocol: TCP
- image: hub.laoma.cloud/library/wordpress:latest
imagePullPolicy: IfNotPresent
name: wordpress
env:
- name: WORDPRESS_DB_USER
value: tom
- name: WORDPRESS_DB_PASSWORD
value: "123"
- name: WORDPRESS_DB_NAME
value: bbs
- name: WORDPRESS_DB_HOST
value: 127.0.0.1
ports:
- containerPort: 80
name: wordpress
protocol: TCP
hostPort: 80
root@master30 ~ 11:39:20# kubectl apply -f pod-blog.yaml
pod/bbs created
# 查看 pod 运行节点
root@master30 ~ 11:39:33# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
bbs 2/2 Running 0 18s 10.224.133.71 worker31.liu.cloud <none> <none>
# 多容器pod中执行命令,通过-c指定容器
root@master30 ~ 11:39:51# kubectl exec bbs -c wordpress -- hostname
bbs
root@master30 ~ 11:40:07#
root@master30 ~ 11:40:07# kubectl cp /etc/hosts bbs:/new-hosts -c wordpress
root@master30 ~ 11:40:17# kubectl exec bbs -c wordpress -- ls /new-hosts
/new-hosts
数据库访问测试
root@master30 ~ 11:40:28# kubectl exec bbs -c mysql -it -- mysql -utom -p123 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| bbs |
| information_schema |
| performance_schema |
+--------------------+
root@master30 ~ 11:40:40# kubectl port-forward pod/bbs --address 10.1.8.30 80:80
Forwarding from 10.1.8.30:80 -> 80
Handling connection for 80
Handling connection for 80
Handling connection for 80
使用所在宿主机的80端口访问:http://10.1.8.30/

pod 关键属性
root@master30 ~ 13:51:29# kubectl explain pod | grep '^ [a-zA-Z]'
apiVersion <string>
kind <string>
metadata <ObjectMeta>
spec <PodSpec>
status <PodStatus>
pod.metadata
root@master30 ~ 13:52:24# kubectl explain pod.metadata | grep '^ [a-zA-Z]'
annotations <map[string]string>
clusterName <string>
creationTimestamp <string>
deletionGracePeriodSeconds <integer>
deletionTimestamp <string>
finalizers <[]string>
generateName <string>
generation <integer>
labels <map[string]string>
managedFields <[]Object>
name <string>
namespace <string>
ownerReferences <[]Object>
resourceVersion <string>
selfLink <string>
uid <string>
需要关注的属性:labels,name,namespace。
pod.spec
root@master30 ~ 13:52:32# kubectl explain pod.spec | grep '^ [a-zA-Z]'
activeDeadlineSeconds <integer>
affinity <Affinity>
automountServiceAccountToken <boolean>
containers <[]Container> -required-
dnsConfig <PodDNSConfig>
dnsPolicy <string>
enum: ClusterFirst, ClusterFirstWithHostNet, Default, None
enableServiceLinks <boolean>
ephemeralContainers <[]EphemeralContainer>
hostAliases <[]HostAlias>
hostIPC <boolean>
hostNetwork <boolean>
hostPID <boolean>
hostUsers <boolean>
hostname <string>
imagePullSecrets <[]LocalObjectReference>
initContainers <[]Container>
nodeName <string>
nodeSelector <map[string]string>
os <PodOS>
overhead <map[string]Quantity>
preemptionPolicy <string>
enum: Never, PreemptLowerPriority
priority <integer>
priorityClassName <string>
readinessGates <[]PodReadinessGate>
resourceClaims <[]PodResourceClaim>
restartPolicy <string>
enum: Always, Never, OnFailure
runtimeClassName <string>
schedulerName <string>
schedulingGates <[]PodSchedulingGate>
securityContext <PodSecurityContext>
serviceAccount <string>
serviceAccountName <string>
setHostnameAsFQDN <boolean>
shareProcessNamespace <boolean>
subdomain <string>
terminationGracePeriodSeconds <integer>
tolerations <[]Toleration>
topologySpreadConstraints <[]TopologySpreadConstraint>
volumes <[]Volume>
重点关注:containers、nodeName、volumes等。
pod.spec.containers
root@master30 ~ 13:53:06# kubectl explain pod.spec.containers | grep '^ [a-zA-Z]'
args <[]string>
command <[]string>
env <[]EnvVar>
envFrom <[]EnvFromSource>
image <string>
imagePullPolicy <string>
enum: Always, IfNotPresent, Never
lifecycle <Lifecycle>
livenessProbe <Probe>
name <string> -required-
ports <[]ContainerPort>
readinessProbe <Probe>
resizePolicy <[]ContainerResizePolicy>
resources <ResourceRequirements>
restartPolicy <string>
securityContext <SecurityContext>
startupProbe <Probe>
stdin <boolean>
stdinOnce <boolean>
terminationMessagePath <string>
terminationMessagePolicy <string>
enum: FallbackToLogsOnError, File
tty <boolean>
volumeDevices <[]VolumeDevice>
volumeMounts <[]VolumeMount>
workingDir <string>
重点关注:command、env、image、imagePullPolicy、volumeMounts等。
pod.spec.containers.ImagePullPolicy
- Always,总是从仓库下载镜像。
- Never,只使用本地镜像,不下载。
- IfNotPresent,优先使用本地镜像,如果没有才从仓库下载镜像。
pod lifecycle 和 status
pod lifecycle
- pod的生命周期取决于pod中所有容器的生命周期。
- 容器的生命周期取决于容器中进程的生命周期。
Pod status
常见 pod 状态如下:
- ContainerCreating 正在创建
- Running 正在运行
- Completed 运行完成
- Error/RunContainerError 运行错误
- CrashLoopBackOff 重新创建
- ErrImagePull 获取镜像错误
- ImagePullBackOff 重新获取镜像
- Terminating,正在终止(删除)
实验1:pod中包含1个容器,验证pod状态
监控命令: watch -n 1 kubectl get pod
示例1:
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Never
containers:
- name: busybox
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10']
command命令可以改写如下:
command:
- sh
- -c
- echo OK! && sleep 10
或者
args:
- sh
- -c
- echo OK! && sleep 10
观察pod状态为:ContainerCreating–>Running–>Completed
示例2:
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Never
containers:
- name: busybox
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echoxxx Hello Kubernetes! && sleep 5']
实验2:pod中包含2个容器,验证pod状态
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Never
containers:
- name: busybox1
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 5']
- name: busybox2
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10']
观察pod状态为:ContainerCreating–>Running–>NotReady–>Completed
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Never
containers:
- name: busybox1
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echoxx Hello Kubernetes! && sleep 5']
- name: busybox2
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 20']
观察pod状态为:ContainerCreating–>Error
pod.spec.restartPolicy
示例:
restartPolicy: Never
containers:
- name: myapp-container
image: docker.io/library/busybox
command: ['sh', '-c', 'echo The app is running! && sleep 5']
restartPolicy,针对pod中所有容器生效。
- Always,除了 Running 状态,其他状态总是重启,默认值。
- OnFailure,失败了才重启。
- Never,从不重启。
实验1:验证pod中含有单个容器重启策略。
更改pod重启策略,直接apply会报错,需要删除重建。
第一个yaml验证Always/OnFailure/Never重启策略
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Always/OnFailure/Never
containers:
- name: busybox
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 5']
第二个yaml验证OnFailure
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: OnFailure
containers:
- name: busybox
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echoxxx Hello Kubernetes! && sleep 5']
第三个yaml验证 Never 重启策略
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Never
containers:
- name: busybox
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echoxxx Hello Kubernetes! && sleep 5']
实验2:验证pod中含有多个容器重启策略。
验证结果:只要有一个容器满足重启策略条件,就会重启。
示例1:
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Always/OnFailure/Never
containers:
- name: busybox1
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 5']
- name: busybox2
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 5']
使用Always重启策略时,当容器busybox1状态为Completed时,容器busybox2还未创建成功,此时会根据重启策略重启pod。当然也可以将容器的生命周期延长,sleep 5改为sleep 50,运行50s之后还会重启pod。
使用OnFailure/Never重启策略就不会出现这种情况。
示例2:第二个command是错误的。
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
restartPolicy: Always/OnFailure/Never
containers:
- name: busybox1
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 5']
- name: busybox2
image: docker.io/library/busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echoxxx Hello Kubernetes! && sleep 5']
Always和OnFailure重启策略总是会重启pod;Never重启策略就不会重启pod。
Init Containers
一个pod可以有多个容器在其中运行应用程序,也可以有一个或多个initContainers。initContainers中容器状态必须是complete,containers容器才能运行。
如果pod的initContainers fail,kubernetes根据restartpolicy重启pod,直到initContainers状态为complete。
如果pod中initContainers有多个容器,那么会按顺序创建和执行。按顺序执行的initContainers必须成功才能执行下一个initContainers。所有init全部成功执行完成后,才开始执行pod中常规容器。
使用场景:
1、等待某个服务创建成功。
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
2、等待固定时间后再运行app容器。
sleep 60
3、Clone a git repository into a volume
示例1:
vim pod-myapp.yaml
# myservice
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
# mydb
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
# myapp
---
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
initContainers:
- name: init-myservice
image: docker.io/library/busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;sleep 3;']
- name: init-mydb
image: docker.io/library/busybox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;sleep 3;']
containers:
- name: myapp-container
image: docker.io/library/busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
首先创建2个service,然后创建pod,观察pod状态变化。
示例2:
vim pod-myapp.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
volumes:
- name: workdir
emptyDir: {}
containers:
- name: myapp-container
image: docker.io/library/busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
volumeMounts:
- name: workdir
mountPath: "/work-dir"
initContainers:
- name: init-poda
image: docker.io/library/busybox
command: ['sh', '-c', 'touch /work-dir/aa.txt && sleep 10']
volumeMounts:
- name: workdir
mountPath: "/work-dir"
在app容器中查看文件
root@master30:~# kubectl exec myapp-pod -c myapp-container -- ls /xx
pod的状态变化:Init:0/1->PodInitializing->Running
将初始化容器command变更为以下内容再测试:
command: ['sh', '-c', 'touchxx /work-dir/aa.txt']
pod的状态变化:
Init:0/1->Init:Error->Init:CrashLoopBackOff,然后Init:Error->Init:CrashLoopBackOff循环。
静态 Pod
**疑问:**常规 Pod 由 Master 节点组件统一调度管理,但 Master 节点上 kube-apiserver、kube-scheduler、kube-controller-manager 等核心组件自身也以 Pod 形式运行,这类组件由谁管理?
**答案:**由节点本地的 kubelet 进程直接管理。Master 节点集群组件均以静态 Pod 方式运行,完全依托本地 kubelet 管控,无法通过 API Server 执行常规管理操作,不能关联 Deployment、DaemonSet 等控制器,kubelet 也不会为静态 Pod 提供就绪、存活健康检查能力。
我们查看 kubelet 服务配置分析原理:
root@master30 ~ 18:55:18# systemctl status kubelet.service |cat
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; preset: enabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Thu 2026-08-06 18:31:31 CST; 31min ago
Docs: https://kubernetes.io/docs/
Main PID: 1154 (kubelet)
Tasks: 11 (limit: 4557)
Memory: 109.1M (peak: 109.8M)
CPU: 34.813s
CGroup: /system.slice/kubelet.service
└─1154 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock --pod-infra-container-image=registry.k8s.io/pause:3.9
...
root@master30 ~ 19:03:14# cat /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
# kubelet.service服务启动参数通过 Drop-In 文件 10-kubeadm.conf 配置
root@master30 ~ 19:03:16# cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
# 以下参数定义了kubelet配置文件位置
# KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml
# 该文件中的 staticPodPath 参数定义了一个目录
# kubelet会定期扫描该目录中pod文件,并根据目标中文件变动创建和删除pod
root@master30 ~ 19:03:43# grep staticPodPath /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests
root@master30 ~ 19:04:05# ls -1 /etc/kubernetes/manifests
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
**注意:**不要修改 staticPodPath 参数配置,否则需要将集群组件4个yaml文件也要复制过去。
我们还可以通过参数 --pod-manifest-path设置,该目录下所有 pod 也是静态 pod。
root@master30 ~ 19:04:13# kubelet --help|grep pod-manifest-path
--pod-manifest-path string Path to the directory containing static pod files to run, or the path to a single static pod file. Files starting with dots will be ignored. (DEPRECATED: This parameter should be set via the config file specified by the Kubelet's --config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.)
思考
Kubernetes 中 Pod 与容器的区别
答:
容器属于运行时层面概念,是承载业务进程的隔离运行环境。
Kubernetes 中的 Pod 是 K8s 体系独有的抽象概念,是集群内最小调度、管理、自愈单元,可理解为容器的封装载体与统一运行环境。
- 可针对 Pod 独立配置健康检查、重启策略、资源配额等集群管控能力;
- Pod 拥有独立集群 IP,内部所有容器共享该 IP;
- Pod 可挂载独立数据卷,内部容器共享卷存储;
- 单个 Pod 内可运行一个或多个容器,Pod 内所有容器具备以下特性:
- 调度至同一节点,共享网络、存储资源;
- 生命周期同步创建、同步销毁。

| 特性 | 容器 | Pod |
|---|---|---|
| K8s 最小调度单位 | ❌ 不是 | ✅ 是 |
| 独立 IP | ❌ 无 | ✅ 有 |
| 多容器支持 | ❌ 不支持 | ✅ 天然支持 |
| 网络/存储共享 | ❌ 不能 | ✅ 内部容器可共享 |
| 生命周期管理 | ❌ 弱 | ✅ 完整(重启、自愈) |
| 属于谁 | 运行时(Docker/containerd) | Kubernetes |
Kubernetes 为何直接管理 Pod,而非底层容器
- **容器抽象粒度太细,无法直接作为调度对象。**K8s 需要一套完整、独立、可调度、带完整标识的标准化资源载体,也就是 Pod。
- 容器仅代表单一进程隔离环境,由 containerd、Docker 等运行时管控;
- Pod 是容器封装层,整合网络、存储、配置、生命周期等全部集群管控能力。集群调度、扩缩容、故障自愈、服务发现、监控告警等所有核心能力,全部以 Pod 为操作单位。
-
Pod 原生支持多容器协同部署(核心设计优势)
大量业务场景需要多个容器协同运行、共享资源:
-
业务主容器 + Sidecar 辅助容器(日志采集、链路监控、流量代理)
-
业务主容器 + Init 初始化容器(前置依赖校验、资源预处理)
-
业务容器 + 网络 / 安全代理容器
这类组合有统一诉求:
-
共享 Network Namespace,共用同一个 IP 与端口空间;
-
共享数据卷,实现文件互通;
-
必须调度至同一台节点,生命周期同步启停。
-
Pod 提供统一标准化生命周期与自愈机制
集群需要实现容器自动重启、故障节点实例重建、滚动更新、弹性扩缩容等能力,这些操作必须作用于统一、稳定的资源单元:
- 若直接管控底层容器,多容器组合应用的生命周期会出现管理混乱;
- 以 Pod 为最小单元,集群管理逻辑统一、语义清晰一致。
-
屏蔽底层容器运行时,实现解耦
Pod 作为上层抽象,隔离底层容器实现差异,集群无需绑定某一款容器引擎:
-
Docker
-
containerd
-
cri-o
-
其他兼容 CRI 标准的运行时
Kubernetes 仅通过 CRI 接口与 Pod 资源交互,底层容器实现可无缝替换。
详解 Pod 内 pause 容器的作用
在 Kubernetes 集群中,每一个 Pod 创建时都会自动启动 pause 容器(又称 infra 基础设施容器),它是 Pod 内第一个启动、最后销毁的容器,是 Pod 正常运行的基础。
-
pause 容器核心定位
pause 容器的核心作用是预先占用并持续持有 Pod 的网络、各类命名空间资源。
-
三大核心功能
① 创建并持续持有 Pod 的 Linux Namespace
Pod 内所有容器需要共享:
-
Network namespace(统一 IP、端口空间)
-
PID namespace(可选配置开启)
-
IPC namespace
这类共享隔离空间必须由一个长期存活的容器持有,一旦持有容器退出,共享空间会直接销毁,这个承载容器就是 pause。
② 保障 Pod 生命周期与业务容器解耦
-
业务容器崩溃后会按照重启策略重建;
-
pause 容器持续运行不退出 → Pod 本身不会销毁;
-
Pod 绑定的 IP、网络配置、挂载数据卷全部保留不变。
若无 pause 容器,业务容器一旦退出,Pod 网络环境会直接销毁,重启容器也无法恢复原有网络。
③ 实现多容器共享网络通信
Nginx、业务程序、Sidecar 等容器全部加入 pause 的网络命名空间:
- 共用同一个 Pod IP;
- 容器之间可通过
127.0.0.1互相访问; - 同一 Pod 内容器端口不能冲突。
- 通俗类比
-
pause 容器 = 房屋房东
-
Pod = 整套房屋
-
业务容器 = 租住的租客
房东(pause)提前占用整套房屋对应的网络、命名空间资源,租客(业务容器)入驻其中。租客即便更换多轮,房屋本身、配套网络地址始终保持不变。
-
Pod 内部标准结构
Pod ├── pause 基础设施容器(优先启动) │ 持有:网络命名空间、PodIP、IPC隔离空间 └── 业务容器1、2、3... 全部加入pause持有的共享命名空间 -
精简总结
pause 容器是 Pod 的底层基石
- 核心职责:持续持有各类 Linux Namespace;
- 核心价值:保证 Pod 网络、IP、生命周期环境稳定不丢失。
更多推荐


所有评论(0)