52.kubernetes基础

文章目录

kubenetes基础

第1部:客户端命令kubectl

1:命令帮助

集群中管理可以使用kubectl命令完成

bash 复制代码
[root@master ~ 13:35:17]# kubectl -h
kubectl controls the Kubernetes cluster manager.

 Find more information at: https://kubernetes.io/docs/reference/kubectl/

Basic Commands (Beginner):
  create          Create a resource from a file or from stdin
  expose          Take a replication controller, service, deployment or pod and expose it as
Kubernetes service
  run             在集群上运行特定镜像
  set             为对象设置指定特性

Basic Commands (Intermediate):
  explain         Get documentation for a resource
  get             显示一个或多个资源
  edit            编辑服务器上的资源
  delete          Delete resources by file names, stdin, resources and names, or by resource
label selector

Deploy Commands:
  rollout         Manage the rollout of a resource
  scale           Set a new size for a deployment, replica set, or replication controller
  autoscale       Auto-scale a deployment, replica set, stateful set, or replication control

Cluster Management Commands:
  certificate     Modify certificate resources
  cluster-info    Display cluster information
  top             Display resource (CPU/memory) usage
  cordon          标记节点为不可调度
  uncordon        标记节点为可调度
  drain           清空节点以准备维护
  taint           更新一个或者多个节点上的污点

Troubleshooting and Debugging Commands:
  describe        显示特定资源或资源组的详细信息
  logs            打印 Pod 中容器的日志
  attach          挂接到一个运行中的容器
  exec            在某个容器中执行一个命令
  port-forward    将一个或多个本地端口转发到某个 Pod
  proxy           运行一个指向 Kubernetes API 服务器的代理
  cp              Copy files and directories to and from containers
  auth            Inspect authorization
  debug           Create debugging sessions for troubleshooting workloads and nodes
  events          List events

Advanced Commands:
  diff            Diff the live version against a would-be applied version
  apply           Apply a configuration to a resource by file name or stdin
  patch           Update fields of a resource
  replace         Replace a resource by file name or stdin
  wait            Experimental: Wait for a specific condition on one or many resources
  kustomize       Build a kustomization target from a directory or URL

Settings Commands:
  label           更新某资源上的标签
  annotate        更新一个资源的注解
  completion      Output shell completion code for the specified shell (bash, zsh, fish, or
powershell)

Other Commands:
  api-resources   Print the supported API resources on the server
  api-versions    Print the supported API versions on the server, in the form of "group/vers
  config          修改 kubeconfig 文件
  plugin          Provides utilities for interacting with plugins
  version         输出客户端和服务端的版本信息

Usage:
  kubectl [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

使用api-resources可以查看命令的简称

bash 复制代码
[root@master ~ 13:46:39]# kubectl api-resources 
NAME                              SHORTNAMES   APIVERSION                             NAMESPND
bindings                                       v1                                     true  nding
componentstatuses                 cs           v1                                     false mponentStatus
configmaps                        cm           v1                                     true  nfigMap
endpoints                         ep           v1                                     true  dpoints
events                            ev           v1                                     true  ent
limitranges                       limits       v1                                     true  mitRange
namespaces                        ns           v1                                     false mespace
nodes                             no           v1                                     false de
persistentvolumeclaims            pvc          v1                                     true  rsistentVolumeClaim
persistentvolumes                 pv           v1                                     false rsistentVolume
pods                              po           v1                                     true  d
podtemplates                                   v1                                     true  dTemplate
replicationcontrollers            rc           v1                                     true  plicationController
resourcequotas                    quota        v1                                     true  sourceQuota
secrets                                        v1                                     true  cret
serviceaccounts                   sa           v1                                     true  rviceAccount
services                          svc          v1                                     true  rvice
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false tatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io/v1        false lidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io/v1                false stomResourceDefinition
apiservices                                    apiregistration.k8s.io/v1              false IService
controllerrevisions                            apps/v1                                true  ntrollerRevision
daemonsets                        ds           apps/v1                                true  emonSet
deployments                       deploy       apps/v1                                true  ployment
replicasets                       rs           apps/v1                                true  plicaSet
statefulsets                      sts          apps/v1                                true  atefulSet
selfsubjectreviews                             authentication.k8s.io/v1               false lfSubjectReview
tokenreviews                                   authentication.k8s.io/v1               false kenReview
localsubjectaccessreviews                      authorization.k8s.io/v1                true  calSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io/v1                false lfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io/v1                false lfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io/v1                false bjectAccessReview
horizontalpodautoscalers          hpa          autoscaling/v2                         true  rizontalPodAutoscaler
cronjobs                          cj           batch/v1                               true  onJob
jobs                                           batch/v1                               true  b
certificatesigningrequests        csr          certificates.k8s.io/v1                 false rtificateSigningRequest
leases                                         coordination.k8s.io/v1                 true  ase
bgpconfigurations                              crd.projectcalico.org/v1               false PConfiguration
bgppeers                                       crd.projectcalico.org/v1               false PPeer
blockaffinities                                crd.projectcalico.org/v1               false ockAffinity
caliconodestatuses                             crd.projectcalico.org/v1               false licoNodeStatus
clusterinformations                            crd.projectcalico.org/v1               false usterInformation
felixconfigurations                            crd.projectcalico.org/v1               false lixConfiguration
globalnetworkpolicies                          crd.projectcalico.org/v1               false obalNetworkPolicy
globalnetworksets                              crd.projectcalico.org/v1               false obalNetworkSet
hostendpoints                                  crd.projectcalico.org/v1               false stEndpoint
ipamblocks                                     crd.projectcalico.org/v1               false AMBlock
ipamconfigs                                    crd.projectcalico.org/v1               false AMConfig
ipamhandles                                    crd.projectcalico.org/v1               false AMHandle
ippools                                        crd.projectcalico.org/v1               false Pool
ipreservations                                 crd.projectcalico.org/v1               false Reservation
kubecontrollersconfigurations                  crd.projectcalico.org/v1               false beControllersConfiguration
networkpolicies                                crd.projectcalico.org/v1               true  tworkPolicy
networksets                                    crd.projectcalico.org/v1               true  tworkSet
endpointslices                                 discovery.k8s.io/v1                    true  dpointSlice
events                            ev           events.k8s.io/v1                       true  ent
flowschemas                                    flowcontrol.apiserver.k8s.io/v1beta3   false owSchema
prioritylevelconfigurations                    flowcontrol.apiserver.k8s.io/v1beta3   false iorityLevelConfiguration
ingressclasses                                 networking.k8s.io/v1                   false gressClass
ingresses                         ing          networking.k8s.io/v1                   true  gress
networkpolicies                   netpol       networking.k8s.io/v1                   true  tworkPolicy
runtimeclasses                                 node.k8s.io/v1                         false ntimeClass
poddisruptionbudgets              pdb          policy/v1                              true  dDisruptionBudget
clusterrolebindings                            rbac.authorization.k8s.io/v1           false usterRoleBinding
clusterroles                                   rbac.authorization.k8s.io/v1           false usterRole
rolebindings                                   rbac.authorization.k8s.io/v1           true  leBinding
roles                                          rbac.authorization.k8s.io/v1           true  le
priorityclasses                   pc           scheduling.k8s.io/v1                   false iorityClass
csidrivers                                     storage.k8s.io/v1                      false IDriver
csinodes                                       storage.k8s.io/v1                      false INode
csistoragecapacities                           storage.k8s.io/v1                      true  IStorageCapacity
storageclasses                    sc           storage.k8s.io/v1                      false orageClass
volumeattachments                              storage.k8s.io/v1                      false lumeAttachment

kubernetes的重点:

资源类型 调用插件 YAML文件 排故

kubectl命令的书写格式:

kubectl 命令 资源类型 资源名称 <参数1,参数2...>

2:命令详解

命令基础
bash 复制代码
#创建deployment 
[root@master ~ 14:17:23]# kubectl create deploy nginx --image=nginx --replicas=3
deployment.apps/nginx created
[root@master ~ 14:19:35]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-7854ff8877-2h925   0/1     ContainerCreating   0          13s
nginx-7854ff8877-dztxq   0/1     ContainerCreating   0          13s
nginx-7854ff8877-kqfmr   0/1     ContainerCreating   0          13s

#kubectl api-resources  查看资源类型的简称
[root@master ~ 14:21:08]# kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-2h925   1/1     Running   0          3m42s
nginx-7854ff8877-dztxq   1/1     Running   0          3m42s
nginx-7854ff8877-kqfmr   1/1     Running   0          3m42s


#explain 查看资源名称的YAML的模块
[root@master ~ 14:15:43]# kubectl explain deploy 
GROUP:      apps
KIND:       Deployment
VERSION:    v1

DESCRIPTION:
    Deployment enables declarative updates for Pods and ReplicaSets.
    
FIELDS:
  apiVersion	<string>
    APIVersion defines the versioned schema of this representation of an object.
    Servers should convert recognized schemas to the latest internal value, and
    may reject unrecognized values. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

  kind	<string>
    Kind is a string value representing the REST resource this object
    represents. Servers may infer this from the endpoint the client submits
    requests to. Cannot be updated. In CamelCase. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

  metadata	<ObjectMeta>
    Standard object's metadata. More info:
    https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

  spec	<DeploymentSpec>
    Specification of the desired behavior of the Deployment.

  status	<DeploymentStatus>
    Most recently observed status of the Deployment.
root@master ~ 14:16:47]# kubectl explain deploy.kind
#deploy.下一级的模块即可查看下一级的模块


#describe查看详细信息
[root@master ~ 14:19:48]# kubectl describe pod nginx-7854ff8877-2h925

#edit 编辑yaml文件
[root@master ~ 14:20:33]# kubectl edit pod nginx-7854ff8877-2h925
Edit cancelled, no changes made.

#delete删除
[root@master ~ 14:25:25]# kubectl delete pod nginx-7854ff8877-2h925 
pod "nginx-7854ff8877-2h925" deleted

创建metrics-server资源

bash 复制代码
#下载
[root@master ~ 14:28:57]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

#修改配置文件
[root@master ~ 14:58:53]# sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
[root@master ~ 15:00:59]# vim metrics-server-components.yaml 
 - --secure-port=10250
 - --kubelet-insecure-tls       #添加
 
#应用
[root@master ~ 15:01:50]# kubectl apply -f metrics-server-components.yaml 
[root@master ~ 18:34:56]# kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS        AGE
calico-kube-controllers-658d97c59c-hv65v   1/1     Running   3 (3h12m ago)   26h
calico-node-bgtph                          1/1     Running   3 (3h12m ago)   26h
calico-node-vglmz                          1/1     Running   0               179m
calico-node-x5w4t                          1/1     Running   3 (3h12m ago)   26h
coredns-66f779496c-cklwm                   1/1     Running   3 (3h12m ago)   26h
coredns-66f779496c-wgdfz                   1/1     Running   3 (3h12m ago)   26h
etcd-master                                1/1     Running   3 (3h12m ago)   26h
kube-apiserver-master                      1/1     Running   7 (3h11m ago)   26h
kube-controller-manager-master             1/1     Running   3 (3h12m ago)   26h
kube-proxy-4zl57                           1/1     Running   3 (3h12m ago)   26h
kube-proxy-h5sfp                           1/1     Running   3 (3h12m ago)   26h
kube-proxy-rb52m                           1/1     Running   3 (3h12m ago)   26h
kube-scheduler-master                      1/1     Running   3 (3h12m ago)   26h
metrics-server-57999c5cf7-sfkv9            1/1     Running   1 (3h12m ago)   3h37m

删除pod

bash 复制代码
[root@master ~ 18:44:29]# kubectl delete pod metrics-server-57999c5cf7-sfkv9 -n kube-system
pod "metrics-server-57999c5cf7-sfkv9" deleted

#强制删除
[root@master ~ 18:47:42]# kubectl delete pod metrics-server-57999c5cf7-p5j8k -n kube-system --grace-period=0 --force
Warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.

因为创建时设置了副本数,所以删除了还会创建

查看资源创建过程

bash 复制代码
[root@master ~ 18:49:34]# kubectl describe pod metrics-server-57999c5cf7-tqwxt -n kube-system

使用kubectl top 查看资源

bash 复制代码
#有了metrics-server模块则可以使用top命令
[root@master ~ 15:02:48]# kubectl top nodes
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master   141m         7%     957Mi           24%       
node1    91m          2%     627Mi           10%       
node2    87m          2%     577Mi           9%        
[root@master ~ 15:03:22]# kubectl top node node2
NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
node2   87m          2%     577Mi           9%      


[root@master ~ 18:52:16]# kubectl top pod kube-apiserver-master -n kube-system
NAME                    CPU(cores)   MEMORY(bytes)   
kube-apiserver-master   32m          270Mi  
部署命令
集群管理命令

显示集群信息

bash 复制代码
[root@master ~ 18:52:36]# kubectl cluster-info 
Kubernetes control plane is running at https://192.168.18.128:6443
CoreDNS is running at https://192.168.18.128:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

显示资源

bash 复制代码
[root@master ~ 18:54:04]# kubectl top pod -n kube-system
NAME                                       CPU(cores)   MEMORY(bytes)   
calico-kube-controllers-658d97c59c-hv65v   3m           73Mi            
calico-node-bgtph                          25m          216Mi           
calico-node-vglmz                          63m          129Mi           
calico-node-x5w4t                          54m          232Mi           
coredns-66f779496c-cklwm                   3m           68Mi            
coredns-66f779496c-wgdfz                   3m           18Mi            
etcd-master                                15m          119Mi           
kube-apiserver-master                      33m          266Mi           
kube-controller-manager-master             8m           154Mi           
kube-proxy-4zl57                           1m           83Mi            
kube-proxy-h5sfp                           5m           81Mi            
kube-proxy-rb52m                           4m           82Mi            
kube-scheduler-master                      2m           75Mi            
metrics-server-57999c5cf7-tqwxt            5m           21Mi 
故障诊断和调试命令
高级命令
设置命令
其他命令

logs -f 动态查看,logs查看的是容器的日志不是pod的日志

bash 复制代码
[root@master ~ 18:58:04]# kubectl logs nginx-7854ff8877-dztxq 
/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/。。。。。

kubernetes客户端和服务端版本

bash 复制代码
[root@master ~ 19:00:45]# kubectl version
Client Version: v1.28.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.0

集群Node管理

1:查看集群信息

bash 复制代码
[root@master ~ 19:00:52]# kubectl cluster-info 
Kubernetes control plane is running at https://192.168.18.128:6443
CoreDNS is running at https://192.168.18.128:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

2:查看节点信息

查看集群节点信息

bash 复制代码
[root@master ~ 19:01:54]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   26h   v1.28.0
node1    Ready    <none>          26h   v1.28.0
node2    Ready    <none>          26h   v1.28.0

查看集群节点详细信息

bash 复制代码
[root@master ~ 19:02:08]# kubectl get nodes -o wide
NAME     STATUS   ROLES           AGE   VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                 CONTAINER-RUNTIME
master   Ready    control-plane   26h   v1.28.0   192.168.18.128   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4
node1    Ready    <none>          26h   v1.28.0   192.168.18.129   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4
node2    Ready    <none>          26h   v1.28.0   192.168.18.136   <none>        CentOS Linux 7 (Core)   3.10.0-1160.119.1.el7.x86_64   docker://26.1.4

查看节点描述详细信息

bash 复制代码
[root@master ~ 19:02:26]# kubectl describe node master

worker node节点管理集群

使用kubeadm安装如果想在node节点管理就会报错

bash 复制代码
[root@node1 ~ 18:35:03]# kubectl get nodes
E0114 19:03:40.867444   43149 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0114 19:03:40.867657   43149 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0114 19:03:40.877637   43149 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0114 19:03:40.887794   43149 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
E0114 19:03:40.898137   43149 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决方法:只要把master上的管理文件/etc/kubernetes/admin.conf拷贝到node节点的$HOME/.kube/config就可以让node节点也可以实现kubectl命令管理

  1. 在node节点的用户家目录创建.kube目录
bash 复制代码
[root@node1 ~ 19:03:40]# mkdir ~/.kube
  1. 在master节点把admin.conf文件复制到node节点
bash 复制代码
[root@master ~ 19:02:48]# scp /etc/kubernetes/admin.conf node1:/root/.kube/config
The authenticity of host 'node1 (192.168.18.129)' can't be established.
ECDSA key fingerprint is SHA256:Mybu0Emk/mh5+fern00Gs1prNuq7NJOQr5IqprDDgOo.
ECDSA key fingerprint is MD5:5a:14:c6:7d:53:b1:9d:6e:2d:27:f2:08:c7:db:e4:c6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node1,192.168.18.129' (ECDSA) to the list of known hosts.
root@node1's password: #输入密码
admin.conf                                                           100% 5650     5.2MB/s   00:00 
  1. 在node节点验证
bash 复制代码
[root@node1 ~ 19:04:23]# kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   26h   v1.28.0
node1    Ready    <none>          26h   v1.28.0
node2    Ready    <none>          26h   v1.28.0

dashboard界面

下载安装

下载资源

bash 复制代码
[root@master ~ 19:07:40]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

修改文件

bash 复制代码
[root@master ~ 19:07:53]# vim recommended.yaml
 32 kind: Service
 33 apiVersion: v1
 34 metadata:
 35   labels:
 36     k8s-app: kubernetes-dashboard
 37   name: kubernetes-dashboard
 38   namespace: kubernetes-dashboard
 39 spec:
 40   ports:
 41     - port: 443
 42       targetPort: 8443
 43       nodePort: 30001   #添加
 44   selector:
 45     k8s-app: kubernetes-dashboard
 46   type: NodePort   #添加

应用修改后配置

bash 复制代码
[root@master ~ 19:10:59]# kubectl apply -f recommended.yaml 

查看pod状态

bash 复制代码
[root@master ~ 19:12:07]# kubectl get pods -n kubernetes-dashboard 
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-5657497c4c-r9x5m   1/1     Running   0          61s
kubernetes-dashboard-746fbfd67c-lvfqf        1/1     Running   0          61s

查看Service暴露端口

bash 复制代码
[root@master ~ 19:12:26]# kubectl get svc -n kubernetes-dashboard 
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.99.18.205    <none>        8000/TCP        94s
kubernetes-dashboard        NodePort    10.97.170.252   <none>        443:30001/TCP   94s

访问dashborad界面

浏览器访问https://192.168.18.128:30001

创建访问令牌(Token)

配置管理员账户

创建rbac.yaml文件

bash 复制代码
[root@master ~ 19:12:59]# vim rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kube-system
应用配置并获取Token
bash 复制代码
[root@master ~ 19:22:22]# kubectl apply -f rbac.yaml 
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

获取token,k8s1.22版本引入,默认有效期1小时,每次执行命令会生成新token,旧token会自动消失

bash 复制代码
[root@master ~ 19:22:57]# kubectl create token dashboard-admin --namespace kube-system
#token:(一次只能用一个小时,一个小时后可以使用这条命令再次创建)
eyJhbGciOiJSUzI1NiIsImtpZCI6IkpQNUNsM0h0R3hPX2I2N3lpTTFIQTVzRjduV3BZSjdkb3hTSVRXMUpNUjQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzY4MzkzNDQ3LCJpYXQiOjE3NjgzODk4NDcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkYXNoYm9hcmQtYWRtaW4iLCJ1aWQiOiI1N2JkZDVjZS0zYzYxLTQzM2ItYjY5Yy0zN2JkNzVhMDM1N2YifX0sIm5iZiI6MTc2ODM4OTg0Nywic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.e5zcWQXJuvLJ41KmEkBs66Uy8efPzaw-EVwFddXNd5-p_Yh7Ye8S4Op6cFwx3Ksjclo_pH3XNShnYYE-KzA8Ql_oWMDADoUJXPDoO-asFH4KzX7tHSWqc6qHtESYmaLD6ClNPyzuYam_G9W9Ea9nqSLukncUyYXbnw8-3K8Pe0T7oa_6_DsnOP0PgP7Qb9-8wB5R6lRPdoSm4LIsP5o219HL1ELDJgR0YOfKeOeXMWYerMZTlztERZxqD87t6VEhhrcAuaSgKFJeyK8rS3Q1BgcC-lXJp2gyM-ce52K8QyxgdsSGeCFTHCZeT8P0qF-vVSVDpq93fRyNvSzJ_QvGFA

进入图形界面查看,发现有5个命名空间

利用命令行查看

bash 复制代码
[root@master ~ 19:24:07]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   27h
kube-node-lease        Active   27h
kube-public            Active   27h
kube-system            Active   27h
kubernetes-dashboard   Active   15m
补充说明:

kubectl get nodes 发现节点NoReady状态:

指定问题所在点:CNI组建问题 本次部署使用的CNI组建是calico 因为使用BGP协议,动态路由,外部网关

检查该节点的calico-node组建是否正常运行,再检查cert证书是否过期,网络问题检查cert证书是否过期,网络问题

节点标签(label)

副本名称=控制器名称+副本ID

pod名称=控制器名称+副本ID+podID

kubernetes集群由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进 行资源对象的相关选择与匹配。

查看节点标签信息

显示的标签以键值对的形式出现,键名:值

bash 复制代码
#显示节点的标签
[root@master ~ 09:05:07]# kubectl get nodes --show-labels 
NAME     STATUS   ROLES           AGE   VERSION   LABELS
master   Ready    control-plane   40h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
node1    Ready    <none>          40h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2    Ready    <none>          40h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux

设置节点标签信息

设置节点标签

bash 复制代码
[root@master ~ 09:14:44]# kubectl label node node2 region=nanjing
node/node2 labeled

[root@master ~ 09:26:58]# kubectl get nodes --show-labels
NAME     STATUS   ROLES           AGE   VERSION   LABELS
master   Ready    control-plane   41h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
node1    Ready    <none>          40h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2    Ready    <none>          40h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,region=nanjing

查看特定键的标签节点

-L 指定特定键名,查看

bash 复制代码
[root@master ~ 09:27:18]# kubectl get nodes -L region
NAME     STATUS   ROLES           AGE   VERSION   REGION
master   Ready    control-plane   41h   v1.28.0   
node1    Ready    <none>          40h   v1.28.0   
node2    Ready    <none>          40h   v1.28.0   nanjing

查看特定键值对的标签节点

-l 指定特定键值对,查看

bash 复制代码
[root@master ~ 09:27:46]# kubectl get nodes -l region=nanjing
NAME    STATUS   ROLES    AGE   VERSION
node2   Ready    <none>   40h   v1.28.0

多维度标签

设置多维度标签,用于不同的需要区分的场景

如把node1标签为合肥,南区机房,测试环境,AI业务

bash 复制代码
[root@master ~ 09:27:59]# kubectl label node node1 region=hefei zone=south env=test bussiness=AI
node/node1 labeled

[root@master ~ 09:39:08]# kubectl get node node1 --show-labels 
NAME    STATUS   ROLES    AGE   VERSION   LABELS
node1   Ready    <none>   41h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,bussiness=AI,env=test,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,region=hefei,zone=south

查看**(键值对用小写l;键名用大写L)**

bash 复制代码
[root@master ~ 09:39:28]# kubectl get nodes -L region,zone
NAME     STATUS   ROLES           AGE   VERSION   REGION    ZONE
master   Ready    control-plane   41h   v1.28.0             
node1    Ready    <none>          41h   v1.28.0   hefei     south
node2    Ready    <none>          41h   v1.28.0   nanjing   
[root@master ~ 09:39:50]# kubectl get nodes -l region=hefei
NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    <none>   41h   v1.28.0

标签的修改(overwrite:使用复写功能

bash 复制代码
[root@master ~ 09:40:22]# kubectl label nodes node1 zone=west --overwrite=true
node/node1 labeled

[root@master ~ 09:41:34]# kubectl get nodes -L zone
NAME     STATUS   ROLES           AGE   VERSION   ZONE
master   Ready    control-plane   41h   v1.28.0   
node1    Ready    <none>          41h   v1.28.0   west
node2    Ready    <none>          41h   v1.28.0 

标签删除

使用key加一个减号的写法来取消标签

只能一个一个的删除

bash 复制代码
[root@master ~ 09:41:46]# kubectl label nodes node1 env-
node/node1 unlabeled
[root@master ~ 09:42:29]# kubectl get nodes -L env
NAME     STATUS   ROLES           AGE   VERSION   ENV
master   Ready    control-plane   41h   v1.28.0   
node1    Ready    <none>          41h   v1.28.0   
node2    Ready    <none>          41h   v1.28.0   
[root@master ~ 09:43:00]# kubectl label node node1 bussiness-
node/node1 unlabeled

[root@master ~ 09:43:54]# kubectl get nodes node1 --show-labels 
NAME    STATUS   ROLES    AGE   VERSION   LABELS
node1   Ready    <none>   41h   v1.28.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,region=hefei,zone=west

标签选择器

用于筛选匹配特定标签的资源,主要分两类:

  1. 等值匹配
  • 精确匹配键值: app=nginx (匹配 app 值为 nginx 的资源)
  • 排除匹配:env!=dev (排除 env=dev 的资源)
  1. 集合匹配
  • key in (value1, value2):匹配值在集合中的资源(如env in (prod,staging))
  • key notin (value):排除指定值(如 tier notin (backend))
  • 存在性检测:key(仅检测键是否存在)
bash 复制代码
[root@master ~ 09:44:01]# kubectl label node node1 env=test1
node/node1 labeled
[root@master ~ 09:44:51]# kubectl label node node2 env=test2
node/node2 labeled
[root@master ~ 09:44:59]# kubectl get nodes -l env!=test1
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   41h   v1.28.0
node2    Ready    <none>          41h   v1.28.0
[root@master ~ 09:45:35]# kubectl get nodes -l "env in (test1,test2)"
NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    <none>   41h   v1.28.0
node2   Ready    <none>   41h   v1.28.0

YAML声明式文件

YAML:仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点。是一个可 读性高,用来表达数据序列的格式。

基本语法

  1. 低版本(1.0、2.0)缩进时不允许使用Tab键,只允许使用空格
  2. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  3. #标识注释,从这个字符一直到行尾,都会被解释器忽略

数据结构

  • 对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
  • 纯量(scalars):单个的、不可再分的值

对象类型:对象的一组键值对,使用冒号结构表示

\ 复制代码
name: Tom   #对于字符串不需要使用引号,但是如果字符串中间有空格需要引号
age: 20  
heigh: 175

Yaml 也允许另一种写法,将所有键值对写成一个行内对象

bash 复制代码
hash: { name: Tom, age: 20, heigh: 175 }

数组类型:一组连词线开头的行,构成一个数组

bash 复制代码
color
- blue
- red
- green

数组也可以采用行内表示法

bash 复制代码
color: [blue, red, green]

复合结构:对象和数组可以结合使用,形成复合结构

bash 复制代码
languages:
- java
- python
- go
websites:
  YAML: yaml.org
  Ruby: ruby-lang.org
  Python: python.org
  Perl: use.perl.org

纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量

bash 复制代码
1 字符串 布尔值 整数 浮点数 Null
2 时间 日期

数值直接以字面量的形式表示
number: 3.14

布尔值用true和false表示
isSet: true

null用 ~ 表示

时间采用 ISO8601 格式
iso8601:2025-7-11t20:00:00.10-05:00

日期采用复合 iso8601 格式的年、月、日表示
date: 1990-07-10

YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true

宇符串

字符串默认不使用引号表示

如果字符串之中包含空格或特殊字符,需要放在引号之中

bash 复制代码
str: hello
str: 'hello world'

单引号和双引号都可以使用,双引号不会对特殊字符转义

bash 复制代码
s1: '你好\n世界'
s2: "你好\n世界"

单引号之中如果还有单引号,必须连续使用两个单引号转义

bash 复制代码
str: 'let ''s go'   输出let 's go

字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为 空格

bash 复制代码
str: 第一行
 第二行
 第三行

多行字符串可以使用|保留换行符,也可以使用>折叠换行(配置文件场景)

bash 复制代码
names: |
tom
jerry
jack

YAML资源对象描述方法

在kubernetes中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件称为资源 清单文件。

常用字段

重点讲解:

version可以使用kubectl api-versions查看或者api-resources查看完整

spec.containers[].imagePullPolicy 镜像拉取策略:

  • Always每次都尝试重新拉取镜像(默认)

  • Never表示仅使用本地镜像

  • ifNotPresent如果本地有镜像就是用本地镜像,没有就拉取

端口类型:

节点端口:hostPort

cluster-IP端口:port

pod端口:targetport

容器端口:containerPort

bash 复制代码
[root@master ~ 19:11:06]# kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP        2d2h
nginx            ClusterIP   10.98.13.195    <none>        80/TCP         3h6m
tomcat-service   NodePort    10.101.252.71   <none>        80:30080/TCP   3h10m

#注意这里使用的IP是seviceSubnet的网段,内部访问不适用podIP,podIP存放在endpoints列表,seviceIP对接endpoints列表
[root@master ~ 19:11:09]# curl 10.98.13.195:80
<!DOCTYPE html>

资源限制:

  1. 运行时限制
  1. 启动时限制(通常比运行时花费的资源更多)
思考题:

当容器运行时出现卡顿情况,但是检查节点资源没有占用过多,这是因为容器运行时限制了资源占用,资源限制上限过低会引起卡顿,可以查看limits

容器重启策略:(由探针监测)

  • Always无论容器如何停止,kubelet都会重启它(kubelet管理pod的运行时生命周期,controller负责管理编排式pod生命周期)

  • OnFailure只有pod非正常退出时才会重启,正常退出时不会重启

  • Never退出后则不会重启

案例说明

查阅使用手册说明

pod的spec中包含可用属性设置

bash 复制代码
kubectl explain pod.spec

创建namespace

bash 复制代码
apiVersion: v1  #使用kubectl api-version查看
kind: Namespace
metadata:
  name: web-content

创建pod资源

该配置包含Deployment和Service两部分。Deployment创建2个Tomcat Pod副本(使用官方镜像), Service通过NodePort类型将容器8080端口映射到主机30080端口,并通过8888服务端口暴露。访问方 式:<节点IP>:

bash 复制代码
[root@master tomcat_dir 19:52:07]# cat tomcat.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: tomcat-web-content
data:
  index.html: |
    <html><body>Hello Tomcat</body></html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat    #必须与template.metadata.labels完全匹配
  template:
    metadata:
      labels:
        app: tomcat   #必须与selector.matchLabels一致
    spec: 
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
      containers:
      - name: tomcat
        image: tomcat:9.0.85-jdk11
        ports: 
        - containerPort: 8080    #容器端口
        volumeMounts:
        - name: web-content
          mountPath: /usr/local/tomcat/webapps/ROOT/index.html
          subPath: index.html
      volumes:
      - name: web-content
        configMap:
          name: tomcat-web-content
---
apiVersion: v1
kind: Service
metadata: 
  name: tomcat-service
spec:
  type: NodePort
  selector:
    app: tomcat   #需与Pod标签匹配
  ports:
  - port: 80   #cluster-ip 端口
    targetPort: 8080  #pod 端口
    nodePort: 30080   #host端口
bash 复制代码
#创建资源
kubectl apply -f tomcat.yaml

如果显示create过程,则查看kubectl describe pod 查看详细情况

一般出现这种情况是因为网络的原因,需要重启calico

bash 复制代码
kubectl rollout restart daemonset calico-node -n kube-system

对于创建好的YAML文件apply后想要重新修改YTAML文件使其显示不同内容,需要先删除原来apply的yYAML文件

bash 复制代码
kubectl delete -f tomcat.yaml

打开网址

http://192.168.18.128:30080/index.html

命名空间(Namespace)

作用

  • Namespace是对一组资源和对象的抽象集合。
  • 常见的 pod, service,deployment 等都是属于某一个namespace的(默认是default)。
  • 不是所有资源都属于namespace,如nodes,persistent volume,namespace 等资源则不属于任 何namespace。

查看namespace

bash 复制代码
[root@master tomcat_dir 14:17:04]# kubectl get ns   (namespaces)
NAME                   STATUS   AGE
default                Active   45h
kube-node-lease        Active   45h
kube-public            Active   45h
kube-system            Active   45h
kubernetes-dashboard   Active   19h

查看namespace中的资源

使用kubectl get all --namespace=命名空间名称 可以查看此命名空间下的所有资源

bash 复制代码
[root@master tomcat_dir 14:17:08]# kubectl get all --namespace=kube-system 
NAME                                           READY   STATUS    RESTARTS      AGE
pod/calico-kube-controllers-658d97c59c-hv65v   1/1     Running   3 (22h ago)   45h
pod/calico-node-4k8kf                          1/1     Running   0             111s
pod/calico-node-dhp6x                          1/1     Running   0             90s
pod/calico-node-dpq8m                          1/1     Running   0             80s
pod/coredns-66f779496c-cklwm                   1/1     Running   3 (22h ago)   45h
pod/coredns-66f779496c-wgdfz                   1/1     Running   3 (22h ago)   45h
pod/etcd-master                                1/1     Running   3 (22h ago)   45h
pod/kube-apiserver-master                      1/1     Running   7 (22h ago)   45h
pod/kube-controller-manager-master             1/1     Running   3 (22h ago)   45h
pod/kube-proxy-4zl57                           1/1     Running   3 (22h ago)   45h
pod/kube-proxy-h5sfp                           1/1     Running   3 (22h ago)   45h
pod/kube-proxy-rb52m                           1/1     Running   3 (22h ago)   45h
pod/kube-scheduler-master                      1/1     Running   3 (22h ago)   45h
pod/metrics-server-57999c5cf7-tqwxt            1/1     Running   0             19h

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns         ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   45h
service/metrics-server   ClusterIP   10.110.158.233   <none>        443/TCP                  23h

NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/calico-node   3         3         3       3            3           kubernetes.io/os=linux   45h
daemonset.apps/kube-proxy    3         3         3       3            3           kubernetes.io/os=linux   45h

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/calico-kube-controllers   1/1     1            1           45h
deployment.apps/coredns                   2/2     2            2           45h
deployment.apps/metrics-server            1/1     1            1           23h

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/calico-kube-controllers-658d97c59c   1         1         1       45h
replicaset.apps/coredns-66f779496c                   2         2         2       45h
replicaset.apps/metrics-server-57999c5cf7            1         1         1       23h

查看所有pod资源

bash 复制代码
[root@master tomcat_dir 14:17:42]# kubectl get pods -A  #A指所有命名空年间
NAMESPACE              NAME                                         READY   STATUS    RESTARTS      AGE
default                nginx-7854ff8877-dztxq                       1/1     Running   1 (22h ago)   23h
default                nginx-7854ff8877-kqfmr                       1/1     Running   1 (22h ago)   23h
default                nginx-7854ff8877-mt8qt                       1/1     Running   1 (22h ago)   23h
default                tomcat-test-75469fdc74-bw5d9                 1/1     Running   0             14m
default                tomcat-test-75469fdc74-kvj2m                 1/1     Running   0             14m
kube-system            calico-kube-controllers-658d97c59c-hv65v     1/1     Running   3 (22h ago)   45h
kube-system            calico-node-4k8kf                            1/1     Running   0             2m15s
kube-system            calico-node-dhp6x                            1/1     Running   0             114s
kube-system            calico-node-dpq8m                            1/1     Running   0             104s
kube-system            coredns-66f779496c-cklwm                     1/1     Running   3 (22h ago)   45h
kube-system            coredns-66f779496c-wgdfz                     1/1     Running   3 (22h ago)   45h
kube-system            etcd-master                                  1/1     Running   3 (22h ago)   45h
kube-system            kube-apiserver-master                        1/1     Running   7 (22h ago)   45h
kube-system            kube-controller-manager-master               1/1     Running   3 (22h ago)   45h
kube-system            kube-proxy-4zl57                             1/1     Running   3 (22h ago)   45h
kube-system            kube-proxy-h5sfp                             1/1     Running   3 (22h ago)   45h
kube-system            kube-proxy-rb52m                             1/1     Running   3 (22h ago)   45h
kube-system            kube-scheduler-master                        1/1     Running   3 (22h ago)   45h
kube-system            metrics-server-57999c5cf7-tqwxt              1/1     Running   0             19h
kubernetes-dashboard   dashboard-metrics-scraper-5657497c4c-r9x5m   1/1     Running   0             19h
kubernetes-dashboard   kubernetes-dashboard-746fbfd67c-lvfqf        1/1     Running   0             19h

创建namespace

命令创建
bash 复制代码
[root@master tomcat_dir 14:18:06]# kubectl create namespace web1
namespace/web1 created
[root@master tomcat_dir 14:18:25]# kubectl get ns
NAME                   STATUS   AGE
default                Active   45h
kube-node-lease        Active   45h
kube-public            Active   45h
kube-system            Active   45h
kubernetes-dashboard   Active   19h
web1                   Active   9s
YAML文件创建
  • k8s中几乎所有的资源都可以通这YAML编排来创建
  • 可以使用 kubectl edit 资源类型 资源名 编辑资源的YAML语法
  • 也可以使用kubectl get 资源类型 资源名 -o yaml来查看
bash 复制代码
[root@master tomcat_dir 14:18:34]# kubectl edit ns web1
Edit cancelled, no changes made.
[root@master tomcat_dir 14:18:55]# kubectl get ns web1 -o yaml 
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2026-01-15T06:18:25Z"
  labels:
    kubernetes.io/metadata.name: web1
  name: web1
  resourceVersion: "63270"
  uid: 32b204dc-ce31-413a-a085-ec42f991f590
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
  • 还可通过 kubectl explain 资源类型 来查看语法文档

查看namespace相关语法参数

bash 复制代码
Kubectl explain namespace

编写创建namespace的YAML文件

bash 复制代码
[root@master tomcat_dir 14:19:08]# vim create_web2.yaml
[root@master tomcat_dir 14:20:27]# cat create_web2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: web2
[root@master tomcat_dir 14:21:05]# kubectl apply -f create_web2.yaml 
namespace/web2 created
[root@master tomcat_dir 14:21:09]# kubectl get ns
NAME                   STATUS   AGE
default                Active   45h
kube-node-lease        Active   45h
kube-public            Active   45h
kube-system            Active   45h
kubernetes-dashboard   Active   19h
web1                   Active   2m55s
web2                   Active   11s

删除namespace

  • 删除一个namespace会自动删除所有属于该namespace的资源(类似MySQL中drop库会删除库里 的所有表一样,请慎重操作)

  • default,kube-system,kube-public命名空间不可删除

  1. 命令删除
bash 复制代码
[root@master tomcat_dir 14:21:20]# kubectl delete ns web1
namespace "web1" deleted
  1. YAML文件删除
bash 复制代码
[root@master tomcat_dir 14:22:19]# kubectl delete -f create_web2.yaml 
namespace "web2" deleted

第2部:kubernetes核心概念

1:Pod

Pod是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元

container(容器)--- 一颗豌豆

Pod(容器组) --- 一个豌豆荚

Node (节点) --- 一根豌豆藤

Cluster(集群) --- 整个豌豆田

2:Controller

在 Kubernetes中,用于管理和运行Pod的对象

pod有静态形式和动态形式

  • **静态 Pod 是 **直接由节点上的 kubelet 进程独立管理 的 Pod,不受 Master 节点的 kube-apiserver、kube-controller-manager 管控
  • 由 K8s 的各类控制器 (Controller) 创建和管理 的 Pod

kubelet用于管理静态pod生命周期

controller用于管理动态pod生命周期

在 Kubernetes 中,控制器通过监控集群的公共状态,并致力于将当前状态转变为期望的状态

举例说明Controller(控制器)作用:房间里的温度自动调节器

当你设置了温度,告诉了温度自动调节器你的期望状态(Desired state)。房间的实际温度是当前状态 (Current state)。 通过对设备的开关控制,温度自动调节器让其当前状态接近期望状态。

一个控制器至少追踪一种类型的 Kubernetes 资源。这些对象有一个代表期望状态的 spec 字段。 该资 源的控制器负责确保其当前状态接近期望状态。

有共有六中控制器:

  • deployment

    • 部署无状态应用
    • 部署无状态应用:认为pod 都一样,没有顺序要求,不用考虑在哪个node 运行,随意进行扩 展和伸缩。
    • 管理Pod和 ReplicaSet
    • 部署、滚动升级等。
    • 典型的像web服务、分布式服务等。
  • StatefulSet

    • 部署有状态应用
    • 有状态应用,每个pod 都独立运行,保持pod 启动顺序和唯一性;有唯一的网络标识符,持久 存储;有序,比如mysql主从;主机名称固定。 而且其扩容以及升级等操作也是按顺序进行的操 作。
  • DaemonSet

    • 部署守护进程
    • Daemonset保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者 其他系统管理应用。 新加入的node 也同样运行在一个pod 里面。
  • job

  • 一次性任务

  • job负责批量处理短暂的一次性任务(short lived one-off tasks),即仅执行一次的任务,它保 证批处理任务的一个或多个Pod成功结束。

  • cronjob

    • 周期性定时任务

3:Label

概念

Label是附着到object上(例如Pod)的键值对。可以在创建object的时候指定,也可以在object创建后随时 指定。Labels的值对系统本身并没有什么含义,只是对用户才有意义。

一个Label是一个key=value的键值对,其中key与value由用户自己指定:

Label可以附加到各种资源对象上,例如Node、Pod、Service、RC等,一个资源对象可以定义任意数量 的Label.同一个Label可以被添加到任意数量的资源对象上去,Label通常在资源对象定义时确定,也可 以在对象创建后动态添加或者删除。

可以通过指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、 方便地进行资源分配、调度、配置、部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监 控和分析应用(日志记录、监控、告警)等。

常用label示例如下所示:

bash 复制代码
版本标签:"release":"stable","release":"canary"...
环境标签:"environment":"dev","environment":"production"
架构标签:"tier":"frontend","tier":"backend","tier":"middleware'
分区标签:"partition":"customerA","partition":"customerB"...
质量管控标签:"track":"daily","track":"weekly"

Label相当于我们熟悉的"标签",给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可 以通过LabelSelector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过这种方式实 现了类似SOL的简单又通用的对象查询机制

语法与字符集

Label key的组成:

  • 不得超过63个字符
  • 可以使用前缀,使用/分隔,前缀必须是DNS子域,不得超过253个字符,系统中的自动化组件创建 的label必须指定前缀,kubernetes.io/由kubernetes保留
  • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

Label value的组成:

  • 不得超过63个字符
  • 起始必须是字母(大小写都可以)或数字,中间可以有连字符、下划线和点

4:Label Selector

通过label selector,客户端/用户可以指定一个object集合,通过label selector对object的集合进行操 作。

Label selector有两种类型:

  • equality-based(基于等式):可以使用=、==、!=操作符,可以使用逗号分隔多个表达式
  • set-based(基于集合):可以使用in、not in、!操作符,另外还可以没有操作符,直接写出某个label 的key,表示过滤有某个key的object而不管该key的value是何值,!表示没有该label的object

例如:

Label selector可以被类比为SQL语句中的where查询条件,例如,name=redis-slave这个label Selector作用于Pod时,可以被类比为select * from pod where pods name ='redis-slave'这样的语 句。

5:Service

将运行在一组 Pods上的应用程序公开为网络服务的抽象方法。

由于Pod是非永久性资源对象,如果使用Controller运行应用程序,可以动态创建和销毁Pod,这样就会 导致无法准确访问到所想要访问的Pod

例如:如果一组 Pod(称为"后端")为集群内的其他Pod(称为"前端")提供功能, 那么前端如何找出并跟踪要 连接的IP 地址,以便前端可以使用提供工作负载的后端部分?

是一组iptables或ipvs规划,通过把客户端的请求转发到服务端(Pod),如有多个Pod情况,亦可实现负载 均衡的效果。

例如:一个图片处理后端,它运行了3个副本(Pod)。这些副本是可互换的 -- 前端不需要关心它们调用了哪 个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化,前端客户端不应该也没必要知 道,而且也不需要跟踪这一组后端的状态。

6:Endpoints

为Service管理后端Pod,当后端Pod被创建或销毁时,endpoints列表会更新Pod对应的IP地址,以便 Service访问请求能够确保被响应。

7:DNS

为kubernetes集群内资源对象的访问提供名称解析,这样就可以实现通过DNS名称而非IP地址来访问服 务。

  • 实现集群内Service名称解析
  • 实现集群内Pod内Container中应用访问互联网提供域名解析

kubernetes核心概念之间的关系

1:Pod与Controller

pod 是通过Controller 实现应用的运维,比如伸缩,滚动升级等待。pod和 controller 通过label 标签建 立关系。

案例:删除其中一个pod,查看controller自动创建新pod

bash 复制代码
[root@master ~ 23:15:06]# kubectl get replicasets
NAME                     DESIRED   CURRENT   READY   AGE
nginx-7854ff8877         3         3         3       33h
tomcat-test-75469fdc74   2         2         2       7h19m
[root@master ~ 23:20:19]# kubectl get pods
NAME                           READY   STATUS    RESTARTS        AGE
nginx-7854ff8877-dztxq         1/1     Running   2 (6h57m ago)   33h
nginx-7854ff8877-kqfmr         1/1     Running   2 (6h57m ago)   33h
nginx-7854ff8877-mt8qt         1/1     Running   2 (6h57m ago)   32h
tomcat-test-75469fdc74-jrqjb   1/1     Running   1 (6h57m ago)   7h20m
tomcat-test-75469fdc74-kpnbk   1/1     Running   1 (6h57m ago)   7h20m
[root@master ~ 23:20:31]# kubectl delete pod tomcat-test-75469fdc74-kpnbk 
pod "tomcat-test-75469fdc74-kpnbk" deleted
[root@master ~ 23:21:09]# kubectl get pods
NAME                           READY   STATUS    RESTARTS        AGE
nginx-7854ff8877-dztxq         1/1     Running   2 (6h58m ago)   33h
nginx-7854ff8877-kqfmr         1/1     Running   2 (6h58m ago)   33h
nginx-7854ff8877-mt8qt         1/1     Running   2 (6h58m ago)   32h
tomcat-test-75469fdc74-jrqjb   1/1     Running   1 (6h58m ago)   7h20m
tomcat-test-75469fdc74-pk8hw   1/1     Running   0               5s

查看控制器管理的标签Selector

bash 复制代码
[root@master ~ 23:22:21]# kubectl describe replicasets tomcat-test-75469fdc74
Name:           tomcat-test-75469fdc74
Namespace:      default
Selector:       app=tomcat,pod-template-hash=75469fdc74
Labels:         app=tomcat
                pod-template-hash=75469fdc74
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/tomcat-test
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=tomcat
           pod-template-hash=75469fdc74
  Containers:
   tomcat:
    Image:        tomcat:9.0.85-jdk11
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:
      /usr/local/tomcat/webapps/ROOT/index.html from web-content (rw,path="index.html")
  Volumes:
   web-content:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      tomcat-web-content
    Optional:  false
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  87s   replicaset-controller  Created pod: tomcat-test-75469fdc74-pk8hw

对应上pod的标签就能进行有效管理

bash 复制代码
[root@master ~ 23:22:33]# kubectl describe pod tomcat-test-75469fdc74
Name:             tomcat-test-75469fdc74-jrqjb
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.18.136
Start Time:       Thu, 15 Jan 2026 16:00:24 +0800
Labels:           app=tomcat
                  pod-template-hash=75469fdc74
Annotations:      cni.projectcalico.org/containerID: 3a0dd78fb171397cf345018dc4d40fe9e84f0a8f26bd6d75c669fdb2860616d4
                  cni.projectcalico.org/podIP: 10.244.104.19/32
                  cni.projectcalico.org/podIPs: 10.244.104.19/32
Status:           Running
IP:               10.244.104.19
IPs:
  IP:           10.244.104.19
Controlled By:  ReplicaSet/tomcat-test-75469fdc74
Containers:
  tomcat:
    Container ID:   docker://5324f2a141dbca52b38c07e0fefb45e583b3b9a9eb07558b402a28c1f55fba38
    Image:          tomcat:9.0.85-jdk11
    Image ID:       docker-pullable://tomcat@sha256:b2a4b6f5e09e147ee81f094051cb43d69efd56a68e76ca5b450b7584c5564c77
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 15 Jan 2026 16:23:57 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    143
      Started:      Thu, 15 Jan 2026 16:00:25 +0800
      Finished:     Thu, 15 Jan 2026 16:22:46 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /usr/local/tomcat/webapps/ROOT/index.html from web-content (rw,path="index.html")
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-stt89 (ro)
.......

2:Pod与Service

service 是为了防止pod 失联,提供的服务发现,类似于微服务的注册中心。定义一组pod 的访问策 略。可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端的各个容 器应用上

service 通过selector 来管控对应的pod。根据label和selector 建立关联,通过service 实现pod 的负载 均衡。

查看所有service

bash 复制代码
[root@master ~ 23:23:33]# kubectl get service
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP        2d7h
nginx            ClusterIP   10.98.13.195    <none>        80/TCP         7h22m
tomcat-service   NodePort    10.101.252.71   <none>        80:30080/TCP   7h27m

查看指定tomcat-service的service

bash 复制代码
[root@master ~ 23:27:44]# kubectl describe svc tomcat-service 
Name:                     tomcat-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=tomcat
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.101.252.71
IPs:                      10.101.252.71
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.104.19:8080,10.244.166.153:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

查看endpoints,

bash 复制代码
[root@master ~ 23:28:01]# kubectl get endpoints
NAME             ENDPOINTS                                             AGE
kubernetes       192.168.18.128:6443                                   2d7h
nginx            10.244.104.20:80,10.244.104.21:80,10.244.166.148:80   7h23m
tomcat-service   10.244.104.19:8080,10.244.166.153:8080                7h27m

3:Service与DNS

通过DNS实现对Service名称解析,以此达到访问后端Pod目的。

查看dns的pod

bash 复制代码
[root@master ~ 23:31:34]# kubectl get pods -n kube-system  | grep dns
coredns-66f779496c-cklwm                   1/1     Running   4 (7h9m ago)   2d7h
coredns-66f779496c-wgdfz                   1/1     Running   4 (7h9m ago)   2d7h

查看service获取集群IP,dns的地址为10.96.0.10

bash 复制代码
[root@master ~ 23:32:04]# kubectl get svc -n kube-system 
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   2d7h
metrics-server   ClusterIP   10.110.158.233   <none>        443/TCP                  32h

查看dns对应的pod地址

bash 复制代码
[root@master ~ 23:32:59]# kubectl get endpoints -n kube-system 
NAME             ENDPOINTS                                                           AGE
kube-dns         10.244.166.151:53,10.244.166.152:53,10.244.166.151:53 + 3 more...   2d7h
metrics-server   10.244.104.18:10250                                                 32h

或者

bash 复制代码
[root@master ~ 23:33:57]# kubectl get pods -n kube-system -o wide | grep dns
coredns-66f779496c-cklwm                   1/1     Running   4 (7h12m ago)   2d7h    10.244.166.152   node1    <none>           <none>
coredns-66f779496c-wgdfz                   1/1     Running   4 (7h12m ago)   2d7h    10.244.166.151   node1    <none>           <none>

使用dns解析tomcat-service

bash 复制代码
[root@master ~ 23:35:47]# yum install -y bind-utils

基于kubernetes集群容器化应用的微服务

1:服务部署方式介绍

  • 单体服务架构

    • 所有服务进程运行在同一台主机内
  • 分布式服务架构

    • 服务进程分布于不同的主机,其中一台主机出现故障,不影响其它主机上的服务运行
  • 微服务架构

    • 使用容器化技术把分布式服务架构运行起来,并实现对不同的服务进程的高可用及快速发布 等。

2:微服务架构服务组件(kubernetes核心概念)之间关系

以在kubernetes集群中运行LNMT(Linux、NGINX、MySQL、Tomcat)应用为例:

把kubernetes集群看做是一个IDC机房,把LNMT的Web架构应用以微服务(kubernetes集群资源对象) 的方式部署到kubernetes集群中。

相关推荐
匀泪1 小时前
CE(SELinux)
运维·服务器
viqjeee2 小时前
Linux ALSA驱动详解
linux·运维·服务器·alsa
夜未央312 小时前
HTTPS 原理与 PHP 文件包含及伪协议详解
运维·服务器·安全·网络安全
云川之下2 小时前
【网络】变长子网划分 (VLSM) 示例、点到点网络
运维·服务器·网络·变长子网
Leon-zy2 小时前
Redis7.4.5集群部署3主3从
redis·分布式·缓存·云原生
Dovis(誓平步青云)2 小时前
《epoll深度解析:从原理到使用,解锁Linux高并发I/O的核心能力(终篇)》
linux·运维·服务器·网络
不会kao代码的小王2 小时前
服务器、存储与网络核心知识全解析
运维·服务器·网络
牛奶咖啡132 小时前
Prometheus+Grafana构建云原生分布式监控系统(一)
云原生·devops·分布式系统·sre·监控方法论·需监控哪些指标·监控与可观测性
nix.gnehc2 小时前
Anolis23 环境下 Docker 与私有 Harbor 仓库完整部署指南
运维·docker·容器