“K8s基础”的版本间的差异

来自linux中国网wiki
跳到导航 跳到搜索
→‎base
 
(未显示同一用户的19个中间版本)
第1行: 第1行:
  
 
=base=
 
=base=
 
+
[[K8s应用#2022]]
  
 
[[Rancher基础]]
 
[[Rancher基础]]
 
  #使用glusterfs做存储,不懂glusterfs的请参考其他文章
 
  #使用glusterfs做存储,不懂glusterfs的请参考其他文章
 +
 +
==命名空间 ==
 +
 +
 +
[https://www.jianshu.com/p/66a963a646f7 k8s实战示例1:创建命名空间和简单pod]
 +
 +
== 容器==
 +
 +
=== 临时容器===
 +
<pre>
 +
 +
root@ubuntu-200430-1:~# kubectl create deployment nginx-deployment --image=nginx:1.25.2-alpine
 +
deployment.apps/nginx-deployment created
 +
root@ubuntu-200430-1:~# kubectl get deploy
 +
NAME              READY  UP-TO-DATE  AVAILABLE  AGE
 +
nginx-deployment  0/1    1            0          11s
 +
 +
root@ubuntu-200430-1:~# kubectl get pod
 +
NAME                                READY  STATUS    RESTARTS  AGE
 +
nginx-deployment-574699d69d-ggwl5  1/1    Running  0          3m55s
 +
root@ubuntu-200430-1:~# kubectl debug -it pods/nginx-deployment-574699d69d-ggwl5 --image=busybox
 +
Defaulting debug container name to debugger-5nbhj.
 +
 +
/ # ping linuxsa.org
 +
PING linuxsa.org (104.21.72.8): 56 data bytes
 +
64 bytes from 104.21.72.8: seq=1 ttl=51 time=322.350 ms
 +
 +
root@ubuntu-200430-1:~#  kubectl describe pods  nginx-deployment-574699d69d-ggwl5
 +
Name:        nginx-deployment-574699d69d-ggwl5
 +
Namespace:    cicd
 +
Priority:    0
 +
 +
 +
Ephemeral Containers:
 +
  debugger-5nbhj:
 +
    Container ID:  containerd://1996b57d36c4a8a8c632e9a5e37dc732231abae65e47dbc95d1fac400399c253
 +
    Image:          busybox
 +
    Image ID:      docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
 +
    Port:          <none>
 +
    Host Port:      <none>
 +
    State:          Terminated
 +
      Reason:      Error
 +
 +
 +
与临时容器共享进程命名空间
 +
 +
进程命名空间共享一直是一个很好的故障排查选项,此功能可用于临时容器。进程命名空间共享不能应用于现有容器,因此必须创建目标容器的副本。 –share-processesflag 在与 –copy-to 一起使用时,可实现进程命名空间共享。这些标志将现有的 Pod spec定义复制到新定义中,并在spec中启用了进程命名空间共享。
 +
 +
$ kubectl debug -it <POD_NAME> --image=busybox --share-processes --copy-to=debug-pod
 +
 +
运行 ps 命令以查看正在运行的进程。 正如您所期望的那样,您可以从 busybox 容器中看到 /pause,从 nginx-deployment 容器中看到 nginx 进程。
 +
/ # ps aux
 +
PID  USER    TIME  COMMAND
 +
    1 65535    0:00 /pause
 +
    7 root      0:00 nginx: master process nginx -g daemon off;
 +
  35 101      0:00 nginx: worker process
 +
  36 101      0:00 nginx: worker process
 +
  37 101      0:00 nginx: worker process
 +
  38 101      0:00 nginx: worker process
 +
  39 root      0:00 sh
 +
  46 root      0:00 ps aux
 +
 +
</pre>
 +
[https://lixianwa.github.io/posts/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8kubernetes%E4%B8%B4%E6%97%B6%E5%AE%B9%E5%99%A8%E8%BF%9B%E8%A1%8C%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5/ 如何使用Kubernetes临时容器进行故障排查]
 +
 +
== label==
 +
=== 给节点打标签label===
 +
<pre>
 +
root@ubuntu-200470-1:~/pod# kubectl get node
 +
NAME    STATUS  ROLES          AGE  VERSION
 +
master  Ready    control-plane  22d  v1.24.10
 +
work1    Ready    <none>          22d  v1.24.10
 +
work2    Ready    <none>          22d  v1.24.10
 +
 +
#给节点1 work1打上 nodename=node01
 +
root@ubuntu-200470-1:~/pod# kubectl  label  nodes  work1  nodename=node01
 +
node/work1 labeled
 +
 +
#查看效果
 +
root@ubuntu-200470-1:~/pod# kubectl get node --show-labels=true
 +
NAME    STATUS  ROLES          AGE  VERSION    LABELS
 +
master  Ready    control-plane  22d  v1.24.10  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=
 +
work1    Ready    <none>          22d  v1.24.10  beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work1,kubernetes.io/os=linux,nodename=node01
 +
work2    Ready    <none>          22d  v1.24.10  beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work2,kubernetes.io/os=linux
 +
 +
 +
#使用 例如在dp
 +
apiVersion: apps/v1
 +
kind: Deployment
 +
metadata:
 +
  name: dep-nginx-sel-node
 +
     
 +
spec:
 +
  replicas: 1
 +
  selector:
 +
    matchLabels:
 +
      app: nginx
 +
   
 +
  template:
 +
    metadata:
 +
      labels:
 +
        app: nginx
 +
        ver: beta
 +
    spec:
 +
      containers:
 +
      - name: nginx
 +
        image: nginx:1.25.2-alpine
 +
        imagePullPolicy: IfNotPresent
 +
      nodeSelector:
 +
        nodename: node01
 +
 +
 +
</pre>
 +
=== label svc===
 +
<pre>
 +
oot@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels
 +
NAME    TYPE        CLUSTER-IP  EXTERNAL-IP  PORT(S)  AGE    LABELS
 +
nginx  ClusterIP  None        <none>        80/TCP    6h15m  app=nginxlabelstest
 +
root@ubuntu-200470-1:~/oct19# kubectl  label svc nginx  version=1
 +
service/nginx labeled
 +
root@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels
 +
NAME    TYPE        CLUSTER-IP  EXTERNAL-IP  PORT(S)  AGE    LABELS
 +
nginx  ClusterIP  None        <none>        80/TCP    6h15m  app=nginxlabelstest,version=1
 +
root@ubuntu-200470-1:~/oct19# kubectl  label svc nginx  version-
 +
service/nginx unlabeled
 +
root@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels
 +
NAME    TYPE        CLUSTER-IP  EXTERNAL-IP  PORT(S)  AGE    LABELS
 +
nginx  ClusterIP  None        <none>        80/TCP    6h16m  app=nginxlabelstest
 +
root@ubuntu-200470-1:~/oct19#
 +
 +
</pre>
 +
 +
 +
==k8s 配置管理  ==
 +
===configmap ===
 +
 +
====ConfigMap 存储 Nginx 配置文件 ====
 +
 +
<pre>
 +
#创建并查看ConfigMap
 +
cat  my-nginx.yaml
 +
apiVersion: apps/v1
 +
kind: Deployment
 +
metadata:
 +
  name: my-nginx
 +
spec:
 +
  replicas: 1
 +
  selector:
 +
    matchLabels:
 +
      app: nginx
 +
  template:
 +
    metadata:
 +
      labels:
 +
        app: nginx
 +
    spec:
 +
      containers:
 +
      - name: nginx
 +
        image: nginx:1.25.2-alpine
 +
        imagePullPolicy: IfNotPresent 
 +
        ports:
 +
        - containerPort: 80
 +
 +
 +
#在k8s集群拉起一个nginx的pod并加载ConfigMap,通过默认8080去访问。
 +
 +
编写nginx的yaml文件,并加载ConfigMap
 +
root@ubuntu-200470-1:~/oct21# cat my-nginx-cm.yaml
 +
apiVersion: apps/v1
 +
kind: Deployment
 +
metadata:
 +
  name: my-nginx
 +
spec:
 +
  replicas: 1
 +
  selector:
 +
    matchLabels:
 +
      app: nginx
 +
  template:
 +
    metadata:
 +
      labels:
 +
        app: nginx
 +
    spec:
 +
      containers:
 +
      - name: nginx
 +
        image: nginx:1.25.2-alpine
 +
        imagePullPolicy: IfNotPresent 
 +
        ports:
 +
        - containerPort: 80
 +
        volumeMounts:
 +
        - name: config-volume
 +
          mountPath: /etc/nginx/conf.d
 +
      volumes:
 +
      - name: config-volume
 +
        configMap:
 +
          name: nginx-conf
 +
root@ubuntu-200470-1:~/oct21# kubectl apply -f  my-nginx-cm.yaml
 +
deployment.apps/my-nginx configured
 +
root@ubuntu-200470-1:~/oct21# kubectl get pod
 +
NAME                                  READY  STATUS                      RESTARTS          AGE
 +
dapi-test-pod                        0/1    Completed                    0                30h
 +
env-valuefrom-64956864d6-sh7hb        0/1    CrashLoopBackOff            138 (3m48s ago)  30h
 +
laravel-deployment-5b44dcf689-lvkhp  1/1    Running                      3 (95m ago)      3d9h
 +
my-nginx-7678bcdf4c-qbl6b            1/1    Running                      0                15s
 +
mydep-759989964c-tdf5l                1/1    Running                      3 (94m ago)      3d6h
 +
mypod                                1/1    Running                      1 (91m ago)      29h
 +
mypod2                                1/1    Running                      1 (95m ago)      29h
 +
mysql-deploy-7fdd46c697-4r842        0/1    CreateContainerConfigError  0                3d9h
 +
nginx-deployment-89857df9d-4m8kl      1/1    Running                      2 (91m ago)      2d6h
 +
nginx-deployment-89857df9d-fcqm5      1/1    Running                      2 (95m ago)      2d6h
 +
nginx-deployment-89857df9d-gwdql      1/1    Running                      2 (94m ago)      2d6h
 +
nginx-deployment-89857df9d-kg595      1/1    Running                      2 (95m ago)      2d6h
 +
nginx-deployment-89857df9d-nbqhm      1/1    Running                      2 (90m ago)      2d6h
 +
secret-env-pod                        0/1    Unknown                      0                29h
 +
web-0                                1/1    Running                      2 (91m ago)      2d5h
 +
web-1                                1/1    Running                      2 (91m ago)      2d5h
 +
web-2                                1/1    Running                      2 (93m ago)      2d4h
 +
wordpress-deploy-5d6679b4c4-tcmpd    1/1    Running                      3 (94m ago)      3d9h
 +
root@ubuntu-200470-1:~/oct21# kubectl get pod my-nginx-7678bcdf4c-qbl6b -o wide
 +
NAME                        READY  STATUS    RESTARTS  AGE  IP              NODE    NOMINATED NODE  READINESS GATES
 +
my-nginx-7678bcdf4c-qbl6b  1/1    Running  0          32s  10.234.252.13  work2  <none>          <none>
 +
root@ubuntu-200470-1:~/oct21# curl 10.234.252.13:8080
 +
<!DOCTYPE html>
 +
<html>
 +
<head>
 +
<title>Welcome to nginx!</title>
 +
<style>
 +
html { color-scheme: light dark; }
 +
body { width: 35em; margin: 0 auto;
 +
font-family: Tahoma, Verdana, Arial, sans-serif; }
 +
</style>
 +
</head>
 +
<body>
 +
<h1>Welcome to nginx!</h1>
 +
<p>If you see this page, the nginx web server is successfully installed and
 +
working. Further configuration is required.</p>
 +
 +
<p>For online documentation and support please refer to
 +
<a href="http://nginx.org/">nginx.org</a>.<br/>
 +
Commercial support is available at
 +
<a href="http://nginx.com/">nginx.com</a>.</p>
 +
 +
<p><em>Thank you for using nginx.</em></p>
 +
</body>
 +
</html>
 +
root@ubuntu-200470-1:~/oct21# kubectl exec -it my-nginx-7678bcdf4c-qbl6b -- cat /etc/nginx/conf.d/default.conf
 +
server {
 +
  listen    8080;
 +
  listen  [::]:80;
 +
  server_name  localhost;
 +
 +
  location / {
 +
      root  /usr/share/nginx/html;
 +
      index  index.html index.htm;
 +
  }
 +
 +
  error_page  500 502 503 504  /50x.html;
 +
  location = /50x.html {
 +
      root  /usr/share/nginx/html;
 +
  }
 +
 +
 +
 +
</pre>
 +
https://www.cnblogs.com/paul8339/p/15424586.html
 +
 +
== controllers 控制器==
 +
 +
===[[控制器DaemonSet]]===
 +
 +
===[[控制器CronJob]]===
 +
 +
=[[Helm3]]=
  
 
=k8s-imagePullPolicy拉取策略=
 
=k8s-imagePullPolicy拉取策略=
第33行: 第304行:
  
 
kubectl exec -it my-pod --container main-app -- /bin/bash
 
kubectl exec -it my-pod --container main-app -- /bin/bash
 +
 +
#chatgpt还不错 给的答案
 +
kubectl exec -it <pod-name> -- /bin/bash
 +
  
 
</pre>
 
</pre>
第80行: 第355行:
  
 
[ k8s中正确删除一个pod  k8s中正确删除一个pod ]
 
[ k8s中正确删除一个pod  k8s中正确删除一个pod ]
 +
=常见组件安装=
 +
== [[安装Metrics server]]==
 +
 +
=[[hpa]]=
 +
  
 
=coredns状态为ImagePullBackOff问题=
 
=coredns状态为ImagePullBackOff问题=
第155行: 第435行:
  
 
[https://blog.csdn.net/hongxiaolu/article/details/113711718  POD 中容器异常重启原因定位]
 
[https://blog.csdn.net/hongxiaolu/article/details/113711718  POD 中容器异常重启原因定位]
 +
 +
=k8s yaml 文件详解=
 +
Kubernetes YAML 文件是定义资源对象(如 Pod、Service、Deployment 等)的主要配置格式。K8s 使用 YAML 文件来声明和管理集群中的资源。以下是 K8s YAML 文件的结构详解:
 +
1. 基础结构
 +
 +
YAML 文件通常包含以下几个核心字段:
 +
 +
    apiVersion: API 版本,指定该资源所属的 API 版本。
 +
    kind: 资源类型,指定要创建的 Kubernetes 对象类型,如 Pod、Service、Deployment 等。
 +
    metadata: 元数据,包括资源的名称、标签、命名空间等。
 +
    spec: 资源的详细配置,具体内容依赖于资源类型。
 +
 +
2. 示例:Pod 配置文件
 +
 +
yaml
 +
 +
apiVersion: v1            # API 版本
 +
kind: Pod                  # 资源类型
 +
metadata:
 +
  name: my-pod            # Pod 名称
 +
  labels:                  # 标签
 +
    app: my-app
 +
spec:
 +
  containers:              # 容器定义
 +
  - name: my-container    # 容器名称
 +
    image: nginx          # 容器镜像
 +
    ports:
 +
    - containerPort: 80    # 容器内部暴露的端口
 +
 +
解释:
 +
 +
    apiVersion: v1:表示使用 K8s v1 API 版本。
 +
    kind: Pod:声明这是一个 Pod 资源。
 +
    metadata:提供元数据,如 Pod 名称、标签等。
 +
    spec:定义了 Pod 的行为和具体配置。
 +
        containers:Pod 中的容器数组,支持多个容器。
 +
        name:容器的名称。
 +
        image:容器使用的镜像。
 +
        ports:声明容器暴露的端口。
 +
 +
 +
3. Deployment 配置文件
 +
 +
yaml
 +
 +
apiVersion: apps/v1        # Deployment 所属的 API 版本
 +
kind: Deployment          # 资源类型:Deployment
 +
metadata:
 +
  name: my-deployment      # Deployment 名称
 +
spec:
 +
  replicas: 3              # 副本数
 +
  selector:                # 用于选择匹配的 Pod
 +
    matchLabels:
 +
      app: my-app
 +
  template:                # Pod 模板
 +
    metadata:
 +
      labels:
 +
        app: my-app
 +
    spec:
 +
      containers:
 +
      - name: my-container
 +
        image: nginx
 +
        ports:
 +
        - containerPort: 80
 +
 +
解释:
 +
 +
    kind: Deployment:指定这是一个 Deployment 资源。
 +
    replicas:声明要运行多少个 Pod 副本。
 +
    selector:用于选择属于该 Deployment 的 Pod,基于 matchLabels 中的标签。
 +
    template:这是 Pod 的模板,Deployment 会根据该模板创建 Pod。
 +
    containers:与 Pod 配置相同,定义了容器的详细信息。
 +
 +
4. Service 配置文件
 +
 +
yaml
 +
 +
apiVersion: v1
 +
kind: Service
 +
metadata:
 +
  name: my-service
 +
spec:
 +
  selector:
 +
    app: my-app            # 选择具有标签 app: my-app 的 Pod
 +
  ports:
 +
  - protocol: TCP
 +
    port: 80              # Service 暴露的端口
 +
    targetPort: 80        # Pod 内部容器的端口
 +
  type: ClusterIP          # Service 的类型
 +
 +
解释:
 +
 +
    kind: Service:定义了一个 Service 资源。
 +
    selector:选择符合该标签的 Pod。
 +
    ports:定义了 Service 暴露的端口及映射到 Pod 的端口。
 +
    type:Service 的类型,可以是 ClusterIP、NodePort、LoadBalancer 等。
 +
 +
5. 常见字段解释
 +
 +
    metadata.name:资源名称。
 +
    metadata.namespace:资源所属的命名空间(不指定则为默认命名空间)。
 +
    spec:主要描述资源的配置,比如 Pod 中的容器配置、Deployment 中的副本数、Service 中的端口配置等。
 +
    labels:键值对的标签,用于标识资源,可以用于选择器(selector)匹配。
 +
    selector:根据标签选择要作用的对象。
 +
    replicas:副本数,适用于 Deployment 和 StatefulSet。
 +
    image:容器镜像,指定要运行的应用版本。
 +
 +
6. 资源类型
 +
 +
Kubernetes 支持多种资源类型,每种资源的 YAML 文件结构都会有所不同。以下是常见的资源类型:
 +
 +
    Pod:最小的可部署单元,运行容器的实例。
 +
    Service:定义了访问 Pod 的方式,可以为多个 Pod 提供一个统一的访问入口。
 +
    Deployment:用于管理无状态应用,支持滚动更新和回滚等高级功能。
 +
    StatefulSet:用于管理有状态应用,保持 Pod 的稳定标识和存储。
 +
    ConfigMap 和 Secret:分别用于管理配置和敏感数据。
 +
    Ingress:定义从外部访问集群内部服务的规则。
 +
    PersistentVolume (PV) 和 PersistentVolumeClaim (PVC):管理持久存储。
 +
 +
7. 应用 YAML 文件
 +
 +
YAML 文件创建完后,可以使用以下命令在 Kubernetes 集群中应用这些文件:
 +
 +
bash
 +
 +
kubectl apply -f <filename>.yaml
 +
 +
 +
8. 查看应用后的资源状态
 +
 +
可以使用以下命令查看资源状态:
 +
 +
    查看 Pod:
 +
 +
    bash
 +
 +
kubectl get pods
 +
 +
查看 Deployment:
 +
 +
bash
 +
 +
kubectl get deployments
 +
 +
查看 Service:
 +
 +
bash
 +
 +
    kubectl get services
 +
 +
 +
  
 
=see also=
 
=see also=
 +
[[在Kubernetes上运行应用程序]]
 +
 +
=references=
 
[https://it.baiked.com/kubernetes/2833.html  几款k8s快速部署的开源项目对比]
 
[https://it.baiked.com/kubernetes/2833.html  几款k8s快速部署的开源项目对比]
  

2024年10月22日 (二) 02:47的最新版本

base

K8s应用#2022

Rancher基础

#使用glusterfs做存储,不懂glusterfs的请参考其他文章

命名空间

k8s实战示例1:创建命名空间和简单pod

容器

临时容器


root@ubuntu-200430-1:~# kubectl create deployment nginx-deployment --image=nginx:1.25.2-alpine 
deployment.apps/nginx-deployment created
root@ubuntu-200430-1:~# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/1     1            0           11s

root@ubuntu-200430-1:~# kubectl get pod 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-574699d69d-ggwl5   1/1     Running   0          3m55s
root@ubuntu-200430-1:~# kubectl debug -it pods/nginx-deployment-574699d69d-ggwl5 --image=busybox
Defaulting debug container name to debugger-5nbhj.

/ # ping linuxsa.org 
PING linuxsa.org (104.21.72.8): 56 data bytes
64 bytes from 104.21.72.8: seq=1 ttl=51 time=322.350 ms

root@ubuntu-200430-1:~#  kubectl describe pods  nginx-deployment-574699d69d-ggwl5
Name:         nginx-deployment-574699d69d-ggwl5
Namespace:    cicd
Priority:     0


Ephemeral Containers:
  debugger-5nbhj:
    Container ID:   containerd://1996b57d36c4a8a8c632e9a5e37dc732231abae65e47dbc95d1fac400399c253
    Image:          busybox
    Image ID:       docker.io/library/busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
    Port:           <none>
    Host Port:      <none>
    State:          Terminated
      Reason:       Error


与临时容器共享进程命名空间

进程命名空间共享一直是一个很好的故障排查选项,此功能可用于临时容器。进程命名空间共享不能应用于现有容器,因此必须创建目标容器的副本。 –share-processesflag 在与 –copy-to 一起使用时,可实现进程命名空间共享。这些标志将现有的 Pod spec定义复制到新定义中,并在spec中启用了进程命名空间共享。

$ kubectl debug -it <POD_NAME> --image=busybox --share-processes --copy-to=debug-pod

运行 ps 命令以查看正在运行的进程。 正如您所期望的那样,您可以从 busybox 容器中看到 /pause,从 nginx-deployment 容器中看到 nginx 进程。
/ # ps aux 
PID   USER     TIME  COMMAND
    1 65535     0:00 /pause
    7 root      0:00 nginx: master process nginx -g daemon off;
   35 101       0:00 nginx: worker process
   36 101       0:00 nginx: worker process
   37 101       0:00 nginx: worker process
   38 101       0:00 nginx: worker process
   39 root      0:00 sh
   46 root      0:00 ps aux

如何使用Kubernetes临时容器进行故障排查

label

给节点打标签label

root@ubuntu-200470-1:~/pod# kubectl get node 
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   22d   v1.24.10
work1    Ready    <none>          22d   v1.24.10
work2    Ready    <none>          22d   v1.24.10

#给节点1 work1打上 nodename=node01
root@ubuntu-200470-1:~/pod# kubectl  label  nodes  work1  nodename=node01
node/work1 labeled

#查看效果
root@ubuntu-200470-1:~/pod# kubectl get node --show-labels=true
NAME     STATUS   ROLES           AGE   VERSION    LABELS
master   Ready    control-plane   22d   v1.24.10   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=
work1    Ready    <none>          22d   v1.24.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work1,kubernetes.io/os=linux,nodename=node01
work2    Ready    <none>          22d   v1.24.10   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=work2,kubernetes.io/os=linux


#使用 例如在dp 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-nginx-sel-node
      
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
     
  template:
    metadata:
      labels:
        app: nginx
        ver: beta
    spec:
      containers:
      - name: nginx
        image: nginx:1.25.2-alpine
        imagePullPolicy: IfNotPresent
      nodeSelector:
        nodename: node01


label svc

oot@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels 
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     LABELS
nginx   ClusterIP   None         <none>        80/TCP    6h15m   app=nginxlabelstest
root@ubuntu-200470-1:~/oct19# kubectl  label svc nginx   version=1
service/nginx labeled
root@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels 
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     LABELS
nginx   ClusterIP   None         <none>        80/TCP    6h15m   app=nginxlabelstest,version=1
root@ubuntu-200470-1:~/oct19# kubectl  label svc nginx   version-
service/nginx unlabeled
root@ubuntu-200470-1:~/oct19# kubectl  get svc nginx --show-labels 
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     LABELS
nginx   ClusterIP   None         <none>        80/TCP    6h16m   app=nginxlabelstest
root@ubuntu-200470-1:~/oct19# 


k8s 配置管理

configmap

ConfigMap 存储 Nginx 配置文件

#创建并查看ConfigMap
cat  my-nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: my-nginx 
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx 
        image: nginx:1.25.2-alpine
        imagePullPolicy: IfNotPresent  
        ports:
        - containerPort: 80


#在k8s集群拉起一个nginx的pod并加载ConfigMap,通过默认8080去访问。

编写nginx的yaml文件,并加载ConfigMap
root@ubuntu-200470-1:~/oct21# cat my-nginx-cm.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: my-nginx 
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx 
        image: nginx:1.25.2-alpine
        imagePullPolicy: IfNotPresent  
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume 
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config-volume 
        configMap:
          name: nginx-conf
root@ubuntu-200470-1:~/oct21# kubectl apply -f  my-nginx-cm.yaml 
deployment.apps/my-nginx configured
root@ubuntu-200470-1:~/oct21# kubectl get pod 
NAME                                  READY   STATUS                       RESTARTS          AGE
dapi-test-pod                         0/1     Completed                    0                 30h
env-valuefrom-64956864d6-sh7hb        0/1     CrashLoopBackOff             138 (3m48s ago)   30h
laravel-deployment-5b44dcf689-lvkhp   1/1     Running                      3 (95m ago)       3d9h
my-nginx-7678bcdf4c-qbl6b             1/1     Running                      0                 15s
mydep-759989964c-tdf5l                1/1     Running                      3 (94m ago)       3d6h
mypod                                 1/1     Running                      1 (91m ago)       29h
mypod2                                1/1     Running                      1 (95m ago)       29h
mysql-deploy-7fdd46c697-4r842         0/1     CreateContainerConfigError   0                 3d9h
nginx-deployment-89857df9d-4m8kl      1/1     Running                      2 (91m ago)       2d6h
nginx-deployment-89857df9d-fcqm5      1/1     Running                      2 (95m ago)       2d6h
nginx-deployment-89857df9d-gwdql      1/1     Running                      2 (94m ago)       2d6h
nginx-deployment-89857df9d-kg595      1/1     Running                      2 (95m ago)       2d6h
nginx-deployment-89857df9d-nbqhm      1/1     Running                      2 (90m ago)       2d6h
secret-env-pod                        0/1     Unknown                      0                 29h
web-0                                 1/1     Running                      2 (91m ago)       2d5h
web-1                                 1/1     Running                      2 (91m ago)       2d5h
web-2                                 1/1     Running                      2 (93m ago)       2d4h
wordpress-deploy-5d6679b4c4-tcmpd     1/1     Running                      3 (94m ago)       3d9h
root@ubuntu-200470-1:~/oct21# kubectl get pod my-nginx-7678bcdf4c-qbl6b -o wide 
NAME                        READY   STATUS    RESTARTS   AGE   IP              NODE    NOMINATED NODE   READINESS GATES
my-nginx-7678bcdf4c-qbl6b   1/1     Running   0          32s   10.234.252.13   work2   <none>           <none>
root@ubuntu-200470-1:~/oct21# curl 10.234.252.13:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ubuntu-200470-1:~/oct21# kubectl exec -it my-nginx-7678bcdf4c-qbl6b -- cat /etc/nginx/conf.d/default.conf 
server {
  listen     8080;
  listen  [::]:80;
  server_name  localhost;

  location / {
      root   /usr/share/nginx/html;
      index  index.html index.htm;
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /usr/share/nginx/html;
  }



https://www.cnblogs.com/paul8339/p/15424586.html

controllers 控制器

控制器DaemonSet

控制器CronJob

Helm3

k8s-imagePullPolicy拉取策略

imagePullPolicy: Always 总是拉取 pull  以前好像是这个默认值
imagePullPolicy: IfNotPresent 默认值,本地有则使用本地镜像,不拉取
imagePullPolicy: Never 只使用本地镜像,从不拉取


k8s 进入pod shell


kubectl get pods   #查看所有正在运行的pod

NAME                            READY     STATUS    RESTARTS   AGE

nginx-56b8c64cb4-t97vb          1/1       Running   3          1d

 kubectl exec -it nginx-56b8c64cb4-t97vb -- /bin/bash      #假如当前pod只有一个容器,运行以下命令即可

root@nginx-56b8c64cb4-t97vb:/# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

root         1     0  0 14:45 ?        00:00:00 nginx: master process nginx -g daemon off;

假如一个pod里有多个容器,用--container or -c 参数。例如:假如这里有个Pod名为my-pod,这个Pod有两个容器,分别名为main-app 和 helper-app,下面的命令将打开到main-app的shell的容器里。

kubectl exec -it my-pod --container main-app -- /bin/bash

#chatgpt还不错 给的答案
kubectl exec -it <pod-name> -- /bin/bash


k8s不进入pod,直接通过shell在pod里执行命令

k8s使用shell进入容器被拒绝连接

k8s删除pod

1、先删除pod2、再删除对应的deployment否则只是删除pod是不管用的,还会看到pod,因为deployment.yaml文件中定义了副本数量


实例如下:

删除pod

[root@test2 ~]# kubectl get pod -n jenkins
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-8698b5449c-grbdm   1/1       Running   0          8s
[root@test2 ~]# kubectl delete pod jenkins2-8698b5449c-grbdm -n jenkins
pod "jenkins2-8698b5449c-grbdm" deleted

查看pod仍然存储

[root@test2 ~]# kubectl get pod -n jenkins
NAME                        READY     STATUS    RESTARTS   AGE
jenkins2-8698b5449c-dbqqb   1/1       Running   0          8s
[root@test2 ~]# 

删除deployment

[root@test2 ~]# kubectl get deployment -n jenkins
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
jenkins2   1         1         1            1           17h
[root@test2 ~]# kubectl delete deployment jenkins2 -n jenkins

再次查看pod消失

deployment.extensions "jenkins2" deleted
[root@test2 ~]# kubectl get deployment -n jenkins
No resources found.
[root@test2 ~]# 
[root@test2 ~]# kubectl get pod -n jenkins
No resources found.

[ k8s中正确删除一个pod k8s中正确删除一个pod ]

常见组件安装

安装Metrics server

hpa

coredns状态为ImagePullBackOff问题


kubectl get pods --all-namespaces

kube-system   coredns-7f6cbbb7b8-knhl8             0/1     ImagePullBackOff   0               24h
kube-system   coredns-7f6cbbb7b8-lt4k5             0/1     ImagePullBackOff   0               24h


解决办法:

确定pod所使用的镜像

kubectl get pods coredns-7f6cbbb7b8-knhl8 -n kube-system -o yaml | grep image




    image: registry.aliyuncs.com/google_containers/coredns:v1.8.4
    imagePullPolicy: IfNotPresent
  - image: registry.aliyuncs.com/google_containers/coredns:v1.8.4
    imageID: ""
        message: Back-off pulling image "registry.aliyuncs.com/google_containers/coredns:v1.8.4"

root@k8s-master:~# docker pull registry.aliyuncs.com/google_containers/coredns:v1.8.4
Error response from daemon: manifest for registry.aliyuncs.com/google_containers/coredns:v1.8.4 not found: manifest unknown: manifest unknown

拉个latest 再别名 
docker pull registry.aliyuncs.com/google_containers/coredns

root@k8s-master:~# docker  images | grep coredns 
registry.aliyuncs.com/google_containers/coredns                   latest    8d147537fb7d   3 months ago   47.6MB

强制 改一下 tag 
root@k8s-master:~# docker tag 8d147537fb7d  registry.aliyuncs.com/google_containers/coredns:v1.8.4

root@k8s-master:~# kubectl get pods --all-namespaces | grep coredns  
kube-system   coredns-7f6cbbb7b8-knhl8             1/1     Running            0                24h
kube-system   coredns-7f6cbbb7b8-lt4k5             1/1     Running            0                24h
root@k8s-master:~# 


root@k8s-master:~#  kubectl get all -n kube-system 
NAME                                     READY   STATUS             RESTARTS        AGE
pod/coredns-7f6cbbb7b8-knhl8             0/1     ImagePullBackOff   0               24h
pod/coredns-7f6cbbb7b8-lt4k5             0/1     ImagePullBackOff   0               24h

docker pull registry.aliyuncs.com/google_containers/coredns

coredns状态为ImagePullBackOff问题

k8s解决coredns 的ImagePullBackOff 和ErrImagePull 问题

https://stackoverflow.com/questions/53559291/kubernetes-coredns-in-crashloopbackoff

Kubernetes CoreDNS 状态是 CrashLoopBackOff 解决思路

CrashLoopBackOff的解决方法

记录一次修复k8s pod长时间处于CrashLoopBackOff状态问题

k8s启动Pod遇到CrashLoopBackOff的解决方法

k8s常见问题

pod无故重启

OOM

运维攻坚之kubernetes pod无故重启问题排查

记一次k8s pod频繁重启的优化之旅

POD 中容器异常重启原因定位

k8s yaml 文件详解

Kubernetes YAML 文件是定义资源对象(如 Pod、Service、Deployment 等)的主要配置格式。K8s 使用 YAML 文件来声明和管理集群中的资源。以下是 K8s YAML 文件的结构详解: 1. 基础结构

YAML 文件通常包含以下几个核心字段:

   apiVersion: API 版本,指定该资源所属的 API 版本。
   kind: 资源类型,指定要创建的 Kubernetes 对象类型,如 Pod、Service、Deployment 等。
   metadata: 元数据,包括资源的名称、标签、命名空间等。
   spec: 资源的详细配置,具体内容依赖于资源类型。

2. 示例:Pod 配置文件

yaml

apiVersion: v1 # API 版本 kind: Pod # 资源类型 metadata:

 name: my-pod             # Pod 名称
 labels:                  # 标签
   app: my-app

spec:

 containers:              # 容器定义
 - name: my-container     # 容器名称
   image: nginx           # 容器镜像
   ports:
   - containerPort: 80    # 容器内部暴露的端口

解释:

   apiVersion: v1:表示使用 K8s v1 API 版本。
   kind: Pod:声明这是一个 Pod 资源。
   metadata:提供元数据,如 Pod 名称、标签等。
   spec:定义了 Pod 的行为和具体配置。
       containers:Pod 中的容器数组,支持多个容器。
       name:容器的名称。
       image:容器使用的镜像。
       ports:声明容器暴露的端口。


3. Deployment 配置文件

yaml

apiVersion: apps/v1 # Deployment 所属的 API 版本 kind: Deployment # 资源类型:Deployment metadata:

 name: my-deployment      # Deployment 名称

spec:

 replicas: 3              # 副本数
 selector:                # 用于选择匹配的 Pod
   matchLabels:
     app: my-app
 template:                # Pod 模板
   metadata:
     labels:
       app: my-app
   spec:
     containers:
     - name: my-container
       image: nginx
       ports:
       - containerPort: 80

解释:

   kind: Deployment:指定这是一个 Deployment 资源。
   replicas:声明要运行多少个 Pod 副本。
   selector:用于选择属于该 Deployment 的 Pod,基于 matchLabels 中的标签。
   template:这是 Pod 的模板,Deployment 会根据该模板创建 Pod。
   containers:与 Pod 配置相同,定义了容器的详细信息。

4. Service 配置文件

yaml

apiVersion: v1 kind: Service metadata:

 name: my-service

spec:

 selector:
   app: my-app            # 选择具有标签 app: my-app 的 Pod
 ports:
 - protocol: TCP
   port: 80               # Service 暴露的端口
   targetPort: 80         # Pod 内部容器的端口
 type: ClusterIP          # Service 的类型

解释:

   kind: Service:定义了一个 Service 资源。
   selector:选择符合该标签的 Pod。
   ports:定义了 Service 暴露的端口及映射到 Pod 的端口。
   type:Service 的类型,可以是 ClusterIP、NodePort、LoadBalancer 等。

5. 常见字段解释

   metadata.name:资源名称。
   metadata.namespace:资源所属的命名空间(不指定则为默认命名空间)。
   spec:主要描述资源的配置,比如 Pod 中的容器配置、Deployment 中的副本数、Service 中的端口配置等。
   labels:键值对的标签,用于标识资源,可以用于选择器(selector)匹配。
   selector:根据标签选择要作用的对象。
   replicas:副本数,适用于 Deployment 和 StatefulSet。
   image:容器镜像,指定要运行的应用版本。

6. 资源类型

Kubernetes 支持多种资源类型,每种资源的 YAML 文件结构都会有所不同。以下是常见的资源类型:

   Pod:最小的可部署单元,运行容器的实例。
   Service:定义了访问 Pod 的方式,可以为多个 Pod 提供一个统一的访问入口。
   Deployment:用于管理无状态应用,支持滚动更新和回滚等高级功能。
   StatefulSet:用于管理有状态应用,保持 Pod 的稳定标识和存储。
   ConfigMap 和 Secret:分别用于管理配置和敏感数据。
   Ingress:定义从外部访问集群内部服务的规则。
   PersistentVolume (PV) 和 PersistentVolumeClaim (PVC):管理持久存储。

7. 应用 YAML 文件

YAML 文件创建完后,可以使用以下命令在 Kubernetes 集群中应用这些文件:

bash

kubectl apply -f <filename>.yaml


8. 查看应用后的资源状态

可以使用以下命令查看资源状态:

   查看 Pod:
   bash

kubectl get pods

查看 Deployment:

bash

kubectl get deployments

查看 Service:

bash

   kubectl get services



see also

在Kubernetes上运行应用程序

references

几款k8s快速部署的开源项目对比


kuernetes 修改pod时区的方法

docker基础知识

Linux的namespace和cgroups简介