kubectl get pod -A          #可以查看所有命名空间pod

kubectl get ns              #可以查看所有命名空间namespace

每个 Pod 必须属于且仅属于一个 Namespace

Namespace 是 Pod 的 "作用域"用来隔离

  • 你执行kubectl get pod不加参数,只看default楼层的小组
  • -n kube-system,才看kube-system这个 "运维部专用楼层" 的小组
  • -A,就是查看整栋大楼所有楼层的所有小组

创建namespace的两种方式

一,直接create

· kubectl create namespace tuling

二,yaml方式

yaml格式——:后必须有一个空格,下一级必须空两格

apiVersion: v1
kind: Namespace
metadata:
  name: ljh

然后apply进行创建

kubectl apply -f ns.yaml

删除namespace

kubectl delete namespace ljh

pod

pod 里面可以有一个或多个容器

运行一个pod

kubectl run mynginx --image=nginx:1.14.2 -n ljh

                    pod名                  指定镜像      指定ns

排错技巧

万一哪个没起来或者什么报错

可以用kubectl describe排错

例如:kubectl describe pod mynginx -n ljh      #-n没有就不用

kubectl logs <pod-name>

kubectl get pod name -owide查看详情

[root@k8s-master ~]# kubectl get pod -owide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          27m   10.244.113.129   k8s-node   <none>           <none>
这个网段10.244.0.0是在初始化master节点时就设定的了

检查这个ready是否为1/1,0/1的话很可能是网卡选错了

编辑配置文件

kubectl edit daemonset calico-node -n kube-system

在env部分添加

- name: IP_AUTODETECTION_METHOD
          value: "interface=ens33"       #设为自己的内网网卡

#yaml创建pod

apiVersion: v1          # Pod的API版本,固定写法
kind: Pod               # 资源类型,这里是创建Pod
metadata:
  labels:
    run: mynginx        # Pod的标签,用来被Service筛选
  name: mynginx         # Pod的名称
spec:
  containers:
  - name: nginx         # 容器名
    image: nginx        # 用的镜像,这里是最新版nginx
    ports:
    - containerPort: 80 # 声明容器暴露80端口(之前kubectl run没加这个,现在补上了)

如果是一个pod含多个容器

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
  - image: tomcat:9.0.55
    name: tomcat

#nameimage的顺序有要求吗?

完全没有要求! 谁在前谁在后都可以,YAML 不关心对象里键的顺序,只要缩进对就行。

进入pod容器内

kubectl exec -it mynginx -c tomcat -- sh

#deployment

用deployment创建pod

kubectl create deployment my-tomcat --image=tomcat:9.0.55

用了deployment后再删除pod会立刻又拉取一个pod

如果是要真的删除的话

kubectl delete deployment my-tomcat

多副本

kubectl create deployment my-tomcat --image=tomcat:9.0.55 --replicas=3
#一次创建三个

#yaml形式创建deployment

apiVersion: apps/v1                          # Deployment的稳定API版本,固定写法
kind: Deployment                             # 资源类型:声明这是一个Deployment
metadata:                                    # 元数据:资源的基本身份信息
 
labels:                                    # 给Deployment本身打标签,方便后续筛选查询
   
app: my-tomcat                           # 标签键值对:标识这个Deployment属于my-tomcat
 
name: my-tomcat                            # Deployment的名称,后续所有操作都用这个名字
spec:                                        # 核心规格:定义Deployment的具体行为
 
replicas: 3                                # 副本数:要求集群中永远保持3个相同的Pod在运行
 
selector:                                  # 筛选器:告诉Deployment要管理哪些Pod
   
matchLabels:                             # 按标签匹配Pod
     
app: my-tomcat                         # 只管理带【app=my-tomcat】标签的Pod
 
template:                                 # Pod模板:Deployment按这个模板批量创建Pod
   
metadata:                                # Pod的元数据
     
labels:                                # 给创建出来的Pod打标签
       
app: my-tomcat                       # Pod的标签,必须和上面selector的标签完全一致
   
spec:                                    # Pod的核心规格
     
containers:                            # Pod内的容器列表(一个Pod可以跑多个容器)
     
- image: tomcat:9.0.55                 # 容器使用的镜像,指定版本9.0.55
       
name: tomcat                         # 容器的名称,在Pod内唯一,方便看日志/进容器排障

#扩容与缩容

# 扩容到5个Pod
kubectl scale --replicas=5 deployment my-tomcat

# 缩容到3个Pod
kubectl scale --replicas=3 deployment my-tomcat

#升级回滚

升级

kubectl set image deployment my-tomcat tomcat=tomcat:10.1.11 --record

查看历史版本

kubectl rollout history deploy my-tomcat

回滚

kubectl rollout undo deployment my-tomcat

#暴露端口-在已有的pod中(service)

kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort

#my-tomcat= 要暴露的 Deployment 名字

kubectl get svc -owide                #查看service端口ip——不搞service的话浏览器访问不了

#yaml格式——app: my-tomcat(deployment名)

label:是打标签

selector:才是 **“找目标” 的规则 **:它会在集群里,找到所有带有 app: my-tomcat 标签的 Pod,然后把流量转发给它们。

#target:我们想要暴露的端口

#nodeport:对外暴露能访问的端口

#port:server内部访问端口

#挂载nfs,先在所以节点安装nfs

# 1. 所有节点(master/node)都要执行:安装 NFS 客户端工具

yum install -y nfs-utils

# 2. 在 master 节点配置共享目录权限

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

# 3. 创建共享目录

mkdir -p /nfs/data

# 4. 启用并启动 rpcbind 和 nfs-server 服务

systemctl enable rpcbind

systemctl enable nfs-server

systemctl start rpcbind

systemctl start nfs-server

# 5. 使配置生效

exportfs -r

#node节点的nfs挂载

mkdir -p /nfs/data

mount -t nfs masterip:/nfs/data /nfs/data

#nginx-pv.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: html
        nfs:
          server: 192.168.11.101  # 替换为你的 NFS 服务器 IP(master 节点 IP)
          path: /nfs/data/nginx-pv

#缺点需要知道ip地址,还有删除pod时会保留不可自主决定去留

#pv挂载要管理员先创有pv.yaml(静态供应)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M          # 声明这个卷的容量为 10MB
  accessModes:
    - ReadWriteMany       # 支持多节点同时读写
  storageClassName: nfs   # 存储类,和 PVC 对应
  nfs:
    path: /nfs/data/01    # NFS 服务器上的目录
    server: 192.168.11.101 # NFS 服务器 IP
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi          # 声明这个卷的容量为 1GB
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.11.101

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi  # 注意:你截图里写的是 py03-3gi,应该是笔误,标准写法是 pv03-3gi
spec:
  capacity:
    storage: 3Gi          # 声明卷容量为 3GB
  accessModes:
    - ReadWriteMany       # 允许多个节点同时读写
  storageClassName: nfs   # 存储类,和 PVC 绑定匹配用
  nfs:
    path: /nfs/data/03    # NFS 服务器上的共享目录
    server: 192.168.11.101 # NFS 服务器 IP(master 节点)

#pvc.yaml创建一个存储空间(pvc申请一般是自己写)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

#最后创建pod(也是自己写)

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html  # 挂载到Nginx网页目录
      volumes:
      - name: html
        persistentVolumeClaim:
          claimName: nginx-pvc  # 绑定你之前创建的PVC

缺点容易资源浪费

#动态供应nfs-storage.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"    #决定是不是作为默认的
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "true"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: 192.168.255.30
            - name: NFS_PATH
              value: /nfs/data
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.255.30
            path: /nfs/data

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

#创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc02
spec:
  storageClassName: nfs-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi

#需要多少就分配多少

ConfigMap用来存储非敏感信息

#创建pod时 创建configmap

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
    - redis-server
    - "/redis-master/redis.conf"  # 指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
  - name: data
    emptyDir: {}
  - name: config
    configMap:
      name: redis-conf
      items:
      - key: redis.conf
        path: redis.conf

#如果要改configmap内容

kubectl edit cm redis-conf

#创建一个阿里云仓库的secret

kubectl create secret docker-registry myregistrykey \
  --docker-server=registry.cn-hangzhou.aliyuncs.com \
  --docker-username=你的阿里云用户名 \
  --docker-password=你的阿里云密码 \
  --docker-email=你的邮箱

#拉取阿里云仓库镜像创pod

apiVersion: v1
kind: Pod
metadata:
  name: redis1
spec:
  containers:
  - name: redis
    image: crpi-cz1mig0dgcoo0245.cn-hangzhou.personal.cr.aliyuncs.com/ljh1234/ljh1234:redis-v1
  imagePullSecrets:
  - name: regcred      #serect名字来获取login阿里云账号密码

 

#ingress

下载ingress

curl -C - -LO  https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/cloud/deploy.yaml

#下载好后进入deploy.yaml文件修改镜像地址(改成国内的)

 找到这行image: k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61a
#改成:registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0

通过命令查看

kubectl get pod -n ingress-nginx -owide

kubectl get svc -n ingress-nginx

#注意ingress-nginx-controller这行 右边一定要是NodePort

#可以进入命令进行修改

kubectl edit svc -n ingress-nginx ingress-nginx-controller

可以注意的两处修改

·  externalTrafficPolicy: Cluster   #如果是local的话是只能是control所在节点ip才能访问

改成Cluster是集群所以节点都可以

·  type: NodePort

但没配置策略浏览器访问不到资源

配置规则转发tomcat-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "1"
spec:
  ingressClassName: nginx
  rules:
  - host: tomcat.tuling.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tomcat
            port:
              number: 8080

apply后,kubectl get ing查看

再来访问

#这样就已经实现了资源转发通过ingress转发到service,访问ingress的端口即跟访问service的一样

面试题:

master与个节点之间的通信:通过apiserver

master怎么控制pod调度到哪个节点:调度器scheduler

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      nodeName: k8s-node1  # 直接写节点名
      containers:
      - name: tomcat
        image: tomcat:8
        ports:
        - containerPort: 8080

#pod的信息都是统一维护到哪里:etcd(数据存储中心)

#pod如何动态缩容扩容(调整副本数):kubectl scale deployment tomcat --replicas=3

#创建deploy形式的两个server,每个server里有两个pod,并由ingress管理两个server

#ing-ser.yaml——创建deploy和server

#ing-ljh.yaml——创建ingress规则

#ing-ser.yaml:

# server-a
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: server-a
  name: server-a
spec:
  replicas: 2
  selector:
    matchLabels:
      app: server-a
  template:
    metadata:
      labels:
        app: server-a
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: server-a
  name: server-a
spec:
  selector:
    app: server-a
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80
---
# server-b
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: server-b
  name: server-b
spec:
  replicas: 2
  selector:
    matchLabels:
      app: server-b
  template:
    metadata:
      labels:
        app: server-b
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: server-b
  name: server-b
spec:
  selector:
    app: server-b
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

#ing-ljh.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ljh-ingress
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "1"
spec:
  ingressClassName: nginx
  rules:
  - host: hello.ljh.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: server-a
            port:
              number: 80

  - host: demo.ljh.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: server-b
            port:
              number: 80

#补充知识点当path是/nginx时,如果浏览器只是访问demo.ljh.com:30460结果如下图

因为规则是只把demo.ljh.com:30460/nginx/下的交到server-b 所以不加/nginx/是找不到东西的,而上面根本没到server层还只是在ingress层

加了之后才能看到这个版本号才是server里的pod里的nginx版本号

#还有一种rewrite功能,表面输入ip:30460/nginx/abc——>ip:30460/abc

#实现方法

1.在metadata处加上图片所示

2.在path处加上

#还想要ingress-nginx其他功能可以访问自行搜索

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/

#kubesphere

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐