写点什么

【云原生】Kubernetes 操作精讲

作者:陈橘又青
  • 2022 年 9 月 15 日
    陕西
  • 本文字数:2831 字

    阅读完需:约 9 分钟

一. 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容器:


命令方式:


# 查看所有运行的podkubectl get pods -A
# 查看指定Namespace下的Podkubectl get pod [-n 命名空间] #(默认default)
# 创建Podkubectl run pod名称 --image=镜像名称
# 查看Pod详细信息kubectl describe pod pod名称
# 删除podkubectl 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: v1kind: Podmetadata:  labels:    run: 运行的pod名称  name: pod名称  namespace: 命名空间spec:  containers:  - image: 镜像名称    name: 容器名称
# 启动Pod:kubectl apply -f yaml文件名称# 删除Pod:kubectl delete -f yaml文件名称
复制代码


Pod 中运行多个容器:


apiVersion: v1kind: Podmetadata:  labels:    run: 运行的pod名称  name: pod名称  namespace: 命名空间spec:  containers:  - image: 镜像名称    name: 容器名称  - image: 镜像名称    name: 容器名称…………    
复制代码


启动后可以查看到:


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名称
复制代码



灰度发布:


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,即可访问:



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



NodePort 方式:


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


命令实现方式:


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



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


apiVersion: v1kind: Servicemetadata:  labels    app: nginx  name: nginx  spec:    selector:      app: nginx    ports:    - port: 8888     protocol: TCP     targetPort: 80
复制代码


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


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


apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginx-deploymentspec:  replicas: 2  selector:    matchLabels:      app: nginx-deployment  template:    metadata:      labels:        app: nginx-deployment    spec:      containers:      - name: nginx-deployment        image: nginx        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  labels:    app: nginx-service  name: nginx-servicespec:  selector:    app: nginx-deployment  ports:  - port: 8888    protocol: TCP    targetPort: 80  type: NodePort
复制代码


可以查看到暴露的信息:


1.5 Ingress

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


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



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



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


推荐使用 yaml 文件方式


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: nginx-ingressspec:  ingressClassName: ingress  rules:  - host: nginx.mashibing.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: nginx-service            port:              number: 8888
复制代码



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


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



# 查看校验webhook的配置kubectl get -A ValidatingWebhookConfiguration
# 删除指定的校验kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
复制代码



发布于: 刚刚阅读数: 3
用户头像

陈橘又青

关注

⭐代码传递思想,技术创造回响 2022.09.02 加入

⭐Java领域新星创作者,华为云享专家,阿里云社区专家博主

评论

发布
暂无评论
【云原生】Kubernetes操作精讲_9月月更_陈橘又青_InfoQ写作社区