05 Pod容器类型及RC&SVC&发布策略

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
posted @ 2025-06-04 08:33  Chains_1  阅读(12)  评论(0)    收藏  举报