01 Pod容器类型
01-1 概述
# 基础架构容器:
为容器提供网络名称空间,pause为容器提供基础网络,该容器由K8S集群内部维护。
使用基础架构容器的启动有kubelet组件来完成,运维人员无需关系。
# 定义了 kubelet 启动时的额外参数
[root@master yaml]# cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6"
![image-20250527110432452]()
图1 定义了 kubelet 启动时的额外参数
# 初始化容器:
# 初始化容器是优先于业务容器启动,但比基础架构后启动,初始化容器可以定义多个,当所有的初始化容器运行完成后,业务容器才会启动。
# 一般情况下,初始化容器为业务容器做一些初始化的相关工作。当然,也可以不定义。
# 业务(应用)容器:
# 实际运行的业务容器,里面运行的都是业务相关的容器,是我们运维人员关心的容器类型。
01-2 案例
[root@master yaml]# cat 08-initcontainer.yaml
apiVersion: v1
kind: Pod
metadata:
name: likexy
labels:
school: ucas
spec:
nodeName: node01
hostNetwork: true
initContainers:
- name: a1
image: alpine:latest
imagePullPolicy: IfNotPresent
command:
- sleep
- "10"
- name: a2
imagePullPolicy: IfNotPresent
image: alpine:latest
command:
- sleep
- "10"
containers:
- name: b1
imagePullPolicy: IfNotPresent
image: alpine:latest
command: ["tail"]
args: ["-f","/etc/hosts"]
![image-20250527123043922]()
图2 容器启动详情
![image-20250527123231839]()
图3 在对应节点查看Pod创建的信息
02 RC副本控制器
# 可以指定控制Pod副本数量始终存活
# 注意:模板里的标签一定要包含标签选择器里的标签
[root@master yaml]# cat 09-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: likexy
labels:
city: Dalian
spec:
# 指定多少个Pod副本始终存活
replicas: 3
# 标签选择器,一般用于关联Pod的标签,rc控制器是基于标签关联Pod。
selector:
school: ucas
app: sql
# 定义创建Pod的模板
template:
spec:
nodeName: node01
containers:
- name: a1
image: alpine:latest
imagePullPolicy: IfNotPresent
command:
- tail
- -f
- /etc/hosts
metadata:
labels:
school: ucas
app: sql
xw: yjs
![image-20250527135437653]()
图4 查看Pod里的容器
![image-20250527140041400]()
图5 删除Pod会重新建Pod
[root@master yaml]# kubectl get replicationcontrollers
NAME DESIRED CURRENT READY AGE
likexy 3 3 3 9m47s
[root@master yaml]# kubectl get rc
NAME DESIRED CURRENT READY AGE
likexy 3 3 3 9m50s
![image-20250527140201519]()
图6 查看RC资源列表
![image-20250527140507215]()
图7 删除RC之后Pod
03 SVC
03-1 基于ClusterIP
[root@master yaml]# cat 10-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: xy
labels:
school: ucas
spec:
# 定义标签选择器关联后端Pod
selector:
apps: v1
school: UCAS
# 定义端口映射
ports:
# 定义Service对外暴露端口
- port: 800
# 定义后端关联Pod端口
targetPort: 80
# 查看SVC信息
[root@master yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.125.0.1 <none> 443/TCP 45h
xy ClusterIP 172.125.67.98 <none> 800/TCP 8m13s
![image-20250528083630619]()
图8 查看SVC信息
[root@master yaml]# kubectl describe svc xy
Name: xy
Namespace: default
Labels: school=ucas
Annotations: <none>
Selector: apps=v1,school=UCAS
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 172.125.67.98
IPs: 172.125.67.98
Port: <unset> 800/TCP
TargetPort: 80/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
![image-20250528083850686]()
图9 查看名为xy的Service资源的详细信息
# 当Pod标签符合SVC定义的标签选择器时,就会转发端口
[root@master yaml]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
likexy-fvxhc 1/1 Running 0 2m39s app=sql,school=ucas,xw=yjs
likexy-pvsq2 1/1 Running 0 2m39s app=sql,school=ucas,xw=yjs
likexy-tgb5t 1/1 Running 0 2m39s app=sql,school=ucas,xw=yjs
[root@master yaml]# kubectl describe svc xy
Name: xy
Namespace: default
Labels: school=ucas
Annotations: <none>
Selector: school=ucas
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 172.125.180.130
IPs: 172.125.180.130
Port: <unset> 800/TCP
TargetPort: 80/TCP
Endpoints: 172.22.2.10:80,172.22.2.8:80,172.22.2.9:80
Session Affinity: None
Events: <none>
![image-20250528084326554]()
图10 Pod标签符合SVC的标签选择器
![image-20250528091719080]()
图11 访问ClusterIP能够访问到网站
# 注意:SVC是具有负载均衡能力的,访问ClusterIP是依次访问这三台服务器的。
# SVC具有服务发现功能
# 当服务器增加或者减少时,Endpoints会随之改变。
# SVC的类型
# ClusterIP
若不定义,则默认为ClusterIP,其作用就是为K8S集群内部提供服务代理。
# NodePort
在ClusterIP基础上,多了一个端口映射,即将k8s集群所有worker节点添加端口转发规则。
# LoadBalancer
在云环境使用。其作用和NodePort类似。
# ExternalName
相当于做CNAME,可以映射K8S集群外部的一个服务到K8S集群内部。
03-2 基于NodePort
[root@master yaml]# cat 11-NodePort.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-likexy
labels:
city: beijing
spec:
type: NodePort
selector:
app: sql
ports:
- port: 88
targetPort: 80
nodePort: 30080
![image-20250529084506181]()
图12 查看Pod和SVC
[root@master yaml]# kubectl describe svc svc-likexy
Name: svc-likexy
Namespace: default
Labels: city=beijing
Annotations: <none>
Selector: app=sql
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 172.125.132.126
IPs: 172.125.132.126
Port: <unset> 88/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 172.22.2.14:80,172.22.2.16:80,172.22.2.17:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
![image-20250529084737798]()
图13 svc-likexy资源的详细信息
[root@master yaml]# kubectl get pods -o wide -l app=sql
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
likexy-2t5cn 1/1 Running 0 15m 172.22.2.14 node01 <none> <none>
likexy-l2b29 1/1 Running 0 15m 172.22.2.17 node01 <none> <none>
likexy-sbqwr 1/1 Running 0 15m 172.22.2.16 node01 <none> <none>
![image-20250529085010797]()
图14 过滤指定标签
03-3 CoreDNS
03-3.1 基本概述
# coreDNS概述
# coreDNS的作用就是将svc的名称解析为ClusterIP。
# 早期使用的skyDNS组件,需要单独部署,在k8s 1.9版本中,我们就可以直接使用kubeadm方式安装CoreDNS组件。
# 从k8s 1.12开始,CoreDNS就成为kubernetes默认的DNS服务器,但是kubeadm支持coreDNS的时间会更早。
# 二进制安装官网
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns
# CoreDNS的IP地址
[root@master yaml]# cat /var/lib/kubelet/config.yaml
...
clusterDNS:
- 172.125.0.10
clusterDomain: xy.com
...
# CoreDNS的A记录
# K8s的A记录格式:
# <service name>[.<namespace name>.svc.cluster.local]
# 案例
# kube-dns.kube-system.svc.xy.com
# svc-mysql80.default.svc.xy.com
# 温馨提示:
(1)如果部署时直接写svc的名称,不写名称空间,则默认的名称空间为其引用资源的名称空间;
(2)kubeadm部署时,无需手动配置CoreDNS组件(默认在kube-system已创建),二进制部署时,需要手动安装该组件;
03-3.2 测试
# 可以看到默认名称空间的NAME为kubernetes,ClusterIP为172.125.0.1
[root@master yaml]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 172.125.0.1 <none> 443/TCP 4d4h
kube-system kube-dns ClusterIP 172.125.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d4h
likexy svc-rc-likexy NodePort 172.125.246.65 <none> 80:30084/TCP 69s
![image-20250530150730340]()
图15 查看SVC
# 在默认名称空间上面创建测试Pod,使用Ping访问,可以看到解析的IP地址
[root@master yaml]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 172.125.0.1 <none> 443/TCP 4d5h
kube-system kube-dns ClusterIP 172.125.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d5h
likexy svc-rc-likexy NodePort 172.125.246.65 <none> 80:30084/TCP 80m
[root@master yaml]# kubectl run test-dns-06 --rm -it --image=alpine:3.20.2 -- sh
If you don't see a command prompt, try pressing enter.
/ # ping kubernetes
PING kubernetes (172.125.0.1): 56 data bytes
^C
--- kubernetes ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
/ # ping kube-dns
ping: bad address 'kube-dns'
/ #
/ # ping svc-rc-likexy
ping: bad address 'svc-rc-likexy'
/ # ping kube-dns.kube-system
PING kube-dns.kube-system (172.125.0.10): 56 data bytes
^C
--- kube-dns.kube-system ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
/ # ping svc-rc-likexy.likexy
PING svc-rc-likexy.likexy (172.125.246.65): 56 data bytes
^C
--- svc-rc-likexy.likexy ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
![image-20250530163043817]()
图16 可以看到解析的IP地址
04 NameSpace
# 什么是名称空间
# 所谓的名称
空间,是用来隔离K8S集群资源的
04-1 响应式管理名称空间
[root@master yaml]# kubectl get namespaces
NAME STATUS AGE
default Active 2d22h
kube-flannel Active 2d22h
kube-node-lease Active 2d22h
kube-public Active 2d22h
kube-system Active 2d22h
![image-20250529090600377]()
图17 查看名称空间
[root@master yaml]# kubectl create ns likexy
namespace/likexy created
[root@master yaml]# kubectl get ns
NAME STATUS AGE
default Active 2d22h
kube-flannel Active 2d22h
kube-node-lease Active 2d22h
kube-public Active 2d22h
kube-system Active 2d22h
likexy Active 2s
![image-20250529090831100]()
图18 创建名称空间
[root@master yaml]# kubectl delete ns likexy
namespace "likexy" deleted
![image-20250529091151106]()
图19 删除名称空间
# 名称空间可以简单理解为Linux根下的不同目录,有默认的名称空间
# default : 系统默认的名称空间。
# kube-flannel : 非系统默认,是安装flannel组件时,自动创建的名称空间。
# kube-node-lease : 系统默认 ,里面没有资源。
# kube-public : 系统默认,里面没有资源。
# kube-system : 系统默认,里面会存放一些系统的资源。比如kube-proxy等。
# 删除名称空间意味着该名称空间下的所有资源都被删除
# 如果不指定名称空间,默认就是defult
[root@master yaml]# kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
likexy-2t5cn 1/1 Running 0 44m
likexy-l2b29 1/1 Running 0 44m
likexy-sbqwr 1/1 Running 0 44m
![image-20250529091845115]()
图20 查看指定名称空间下的资源
![image-20250529092710395]()
图21 查看所有名称空间资源
04-2 声明式管理名称空间
# 声明式创建名称空间
[root@master yaml]# cat 12-create-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: likexy
# 创建资源并制定名称空间
[root@master yaml]# cat 13-ns-svc-pod-rc.yaml
apiVersion: v1
kind: Namespace
metadata:
name: likexy
---
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-likexy
namespace: likexy
spec:
replicas: 3
selector:
city: Dalian
template:
metadata:
labels:
city: Dalian
spec:
containers:
- name: a1
image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2
---
apiVersion: v1
kind: Service
metadata:
name: svc-rc-likexy
namespace: likexy
spec:
type: NodePort
selector:
city: Dalian
ports:
- port: 80
targetPort: 80
nodePort: 30084
[root@master yaml]# kubectl get pods,rc,svc,ns -o wide -n likexy
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/rc-likexy-55ksg 1/1 Running 0 2m6s 172.22.2.18 node01 <none> <none>
pod/rc-likexy-8xt6b 1/1 Running 0 2m6s 172.22.1.2 node02 <none> <none>
pod/rc-likexy-v6szs 1/1 Running 0 2m7s 172.22.1.3 node02 <none> <none>
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicationcontroller/rc-likexy 3 3 3 2m7s a1 registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2 city=Dalian
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/svc-rc-likexy NodePort 172.125.98.139 <none> 80:30084/TCP 84s city=Dalian
NAME STATUS AGE
namespace/default Active 4d3h
namespace/kube-flannel Active 4d3h
namespace/kube-node-lease Active 4d3h
namespace/kube-public Active 4d3h
namespace/kube-system Active 4d3h
namespace/likexy Active 4m23s
![image-20250530144737327]()
图22 查看名称空间,RC,SVC等信息
# 在删除名称空间时,其下的所有资源将被删除【【生产环境慎用!!!】】
[root@master yaml]# kubectl delete ns likexy
namespace "likexy" deleted
[root@master yaml]# kubectl get pods,rc,svc,ns -o wide -n likexy
NAME STATUS AGE
namespace/default Active 4d3h
namespace/kube-flannel Active 4d3h
namespace/kube-node-lease Active 4d3h
namespace/kube-public Active 4d3h
namespace/kube-system Active 4d3h
![image-20250530145431845]()
图23 删除名称空间其下的所有资源被删除
04-3 注意
# 查看资源是否支名称空间,kubectl api-resources输出内容中的NAMESPACED值可以看得出。
[root@master yaml]# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
![image-20250530150008541]()
图24 查看是否支持NameSpace