【云原生】Kubernetes操作精讲

一. Kubernetes操作

首先我们要了解Kubernetes在运行我们的资源时,关联到了哪些内容:

资源的构建方式:

  • 采用kubectl的命令方式
  • yaml文件方式

1.1 Namespace

命名空间:主要是为了对Kubernetes中运行的资源进行过隔离, 但是网络是互通的,类似Docker的容器,可以将多个资源配置到一个NameSpace中。而NameSpace可以对不同环境进行资源隔离,默认情况下Kubernetes提供了default命名空间,在构建资源时,如果不指定资源,默认采用default资源。

命令方式:

# 查看现有的全部命名空间
kubectl get ns

# 构建命名空间
kubectl create ns 命名空间名称

# 删除现有命名空间, 并且会删除空间下的全部资源
kubectl delete ns 命名空间名称

yaml文件方式:(构建资源时,设置命名空间)

apiVersion: v1
kind: Namespace
metadata:
name: test

1.2 Pod

PodKubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器:

命令方式:

# 查看所有运行的pod
kubectl get pods -A

# 查看指定Namespace下的Pod
kubectl get pod [-n 命名空间]  #(默认default)

# 创建Pod
kubectl run pod名称 --image=镜像名称

# 查看Pod详细信息
kubectl describe pod pod名称

# 删除pod
kubectl delete pod pod名称 [-n 命名空间]  #(默认default)

# 查看pod输出的日志
kubectl logs -f pod名称

# 进去pod容器内部
kubectl exec -it pod名称 -- bash

# 查看kubernetes给Pod分配的ip信息,并且通过ip和容器的端口,可以直接访问
kubectl get pod -owide

yaml方式:(推荐)

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称

# 启动Pod:kubectl apply -f yaml文件名称
# 删除Pod:kubectl delete -f yaml文件名称

Pod中运行多个容器:

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称
  - image: 镜像名称
    name: 容器名称
…………    

启动后可以查看到:

图形化页面修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-accKe5I1-1660626781502)(Pictures/image-20220104210823057.png)]

1.3 Deployment

部署时,可以通过Deployment管理和编排Pod

Deployment部署实现:

命令方式:

# 基于Deployment启动容器
kubectl create deployment deployment名称 --image=镜像名称
# 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果
# 需要使用deploy的方式删除deploy
# 查看现在的deployment
kubectl get deployment

# 删除deployment
kubectl delete deployment deployment名称

# 基于Deployment启动容器并设置Pod集群数
kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数

配置文件方式:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
       image: nginx
       ports:
       - containerPort: 80

正常使用kubectl运行yaml即可。

弹性伸缩功能:

# 基于scale实现弹性伸缩
kubectl scale deploy/Deployment名称 --replicas 集群个数
# 或者修改yaml文件
kubectl edit deploy Deployment名称
图形化页面修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-accKe5I1-1660626781502)(Pictures/image-20220104210823057.png)]

灰度发布:

Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod

kubectl set image deployment/Deployment名称 容器名=镜像:版本

1.4 Service

可以将多个Pod对外暴露一个Service,让客户端可以通过Service访问到这一组Pod,并且可以实现负载均衡。

ClusterIP方式:

ClusterIP是集群内部Pod之间的访问方式

命令实现效果:

# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口

之后通过kubectl get service查看Service提供的ip,即可访问:

kubectl get service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEMWVi85-1660626781503)(Pictures/image-20220104214659229.png)]

也可以通过Deployment名称.namespace名称.svc作为域名访问:

在服务容器内执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oIOLEWD-1660626781504)(Pictures/image-20220104215030265.png)]

NodePort方式:

ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问。

命令实现方式:

# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort
查看Service效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnuLcS8n-1660626781505)(Pictures/image-20220104222750733.png)]

Service也可以通过yaml文件实现:

apiVersion: v1
kind: Service
metadata:
  labels
    app: nginx
  name: nginx
  spec:
    selector:
      app: nginx
    ports:
    - port: 8888
     protocol: TCP
     targetPort: 80

通过apply启动就也可以创建Service。

测试效果-Deployment部署,通过Service暴露:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-service
  name: nginx-service
spec:
  selector:
    app: nginx-deployment
  ports:
  - port: 8888
    protocol: TCP
    targetPort: 80
  type: NodePort

可以查看到暴露的信息:

Service信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uISN7NEJ-1660626781506)(Pictures/image-20220105205334996.png)]

1.5 Ingress

Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。

Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装:

Kuboard安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knigd0U0-1660626781507)(Pictures/image-20220105153343642.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzRKK6F1-1660626781507)(Pictures/image-20220105153416367.png)]

因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功。

安装成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJX0fXEJ-1660626781508)(Pictures/image-20220105153502619.png)]

可以将Ingress接收到的请求转发到不同的Service中。

推荐使用yaml文件方式

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: ingress
  rules:
  - host: nginx.mashibing.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 8888
启动时问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RByYpMlD-1660626781509)(Pictures/image-20220105203819715.png)]

Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动。

找到指定的ingress的校验信息,删除即可:

删除信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ovG8ttZH-1660626781509)(Pictures/image-20220105204434044.png)]
# 查看校验webhook的配置
kubectl get -A ValidatingWebhookConfiguration

# 删除指定的校验
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller

配置本地hosts文件

配置hosts
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfmEOz7r-1660626781510)(Pictures/image-20220105204921272.png)]

记下来既可以访问在Service中暴露的Nginx信息:

服通过Ingress访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcFGrcI0-1660626781511)(Pictures/image-20220105205407393.png)]

猜你喜欢

转载自blog.csdn.net/zhangxia_/article/details/126364161