第六章 k8s应用部署

2022-01-23 05:34:18 浏览数 (2)

YAML与Kubernetes

了解现有的YAML描述文件

终端输入以下命令来获取到每个实例的YAML配置文件

代码语言:javascript复制
kubectl get namespaces
kubectl get namespace <namespace的名称> -o yaml
kubectl get nodes
kubectl get node <node的名称> -o yaml 
kubectl get pods          
kubectl get pod <pod的名称> -o yaml 
kubectl get deployments
kubectl get deployment <deployment的名称> -o yaml
kubectl get services
kubectl get service <service的名称> -o yaml

通过kubectl api-versionskubectl api-resources来查询Kubernetes API支持的API版本以及资源对象。

代码语言:javascript复制
kubectl api-versions
kubectl api-resources
kubectl api-resources -o wide   #可以了解不同的资源对象的API版本、kind类型、资源对象的简称等

Kubernetes对象与YAML

kubectl explain命令来了解API对象有哪些属性

代码语言:javascript复制
kubectl explain deployments 
kubectl explain pods
kubectl explain pods.spec
kubectl explain pods.spec.containers

YAML语法快速入门

YAML语法

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时只能使用空格,不能使用Tab键;
  • 缩进的空格数量不重要,只要相同层级的元素左侧对齐即可;
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略;

使用YAML配置文件部署nginx

代码语言:javascript复制
kubectl config get-contexts      #显示所有的集群
kubectl config use-context minikube #切换到本地集群
kubectl apply -f ./deployment.yaml #本地集群创建Deployment
​

Windows中,start .是打开当前目录,deployment.yaml需要复制到命令行当前目录下。

执行完成后:

代码语言:javascript复制
kubectl get deployments #了解创建情况

kubectl apply命令

对象管理的三种方式(前两个跳过,因为已经存在了)

代码语言:javascript复制
#指令式命令,常用命令有run、create、scale、edit、patch、expose等等
kubectl create deployment nginx --image nginx
#指令式对象配置,通用格式为kubectl create|delete|replace|get -f <filename|url>
kubectl create -f nginx.yaml
#声明式对象配置,资源对象的创建、删除以及修改等操作都是通过kubectl apply来实现,它通过对比检查活动对象的当前状态、配置信息等进行更新
kubectl apply -f configs/nginx.yaml

将上面deployment.yaml里的replicas的值由2改成5再来部署,就会发现副本的数量也增加到了5个:

kubectl apply -f支持单文件、多文件、外部链接

代码语言:javascript复制
# 通过单个文件创建资源对象
kubectl apply -f ./my-manifest.yaml  
# 通过多个文件创建资源对象
kubectl apply -f ./my1.yaml -f ./my2.yaml 
# 通过文件夹创建资源对象
kubectl apply -f ./dir    
# 通过外部链接创建资源对象                    
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

网络、服务与负载均衡

端口转发访问集群中的应用

代码语言:javascript复制
kubectl port-forward <资源类型/资源名称> [本地端口]:<pod的端口>

以nginx为例子:

代码语言:javascript复制
kubectl get deployments     #获取deployment的名称列表
kubectl port-forward deployment/nginx-deployment 5001:80

如果出现报错:

代码语言:javascript复制
error: unable to forward port because pod is not running. Current status=Pending

搜索关键词【pod not ready】,找到这篇文章:

A visual guide on troubleshooting Kubernetes deployments

那么就可以用命令kubectl describe查看日志,结果发现Reason里面有个MinimumReplicasUnavailable,搜索一下,查到这篇文章:

K8S集群部署helm tiller及填坑(2)-MinimumReplicasUnavailable,socat not found,configmaps is forbidden等_yanwei2020的博客-CSDN博客

重新apply一下,让状态变为READY就好。

正常提示应该是这样的:

浏览器输入127.0.0.1:5001,就能访问nginx页面了。

中断服务,执行:

代码语言:javascript复制
kubectl get pods    #获取pod列表
kubectl port-forward pod/nginx-deployment-66b6c48dd5-glhqb 5002:80 #换成你的pod名称

可以在localhost:5002访问nginx了。

创建服务Service

Windows系统中,在用户user目录下创建文件nginx-service.yaml,然后在当前目录下打开终端:

代码语言:javascript复制
kubectl apply -f ./nginx-service.yaml #创建一个service
kubectl get services
kubectl describe service nginx-service

minikube service返回一个URL来访问访问服务。

代码语言:javascript复制
minikube service nginx-service --url

去掉—url参数,浏览器打开访问

让公网可以访问

公网访问需要用到负载均衡器LoadBalancer。

新建nginx-lb.yaml文件,并复制到user当前用户目录下。

代码语言:javascript复制
apiVersion: v1
kind: Service
metadata:
   name: nginx-lb
   namespace: default
spec:
   ports:
   - name: tcp-80-80
     port: 80
     protocol: TCP
     targetPort: 80
   selector:
     app: nginx
   type: LoadBalancer

当前目录下命令:

代码语言:javascript复制
kubectl config get-contexts           #显示集群列表,找到你的EKS集群
kubectl config use-context cls-********-context-default         #换成你的EKS集群ID
kubectl apply -f ./deployment.yaml   #使用此前的deployment.yaml 创建一个nginx引用
kubectl apply -f ./nginx-lb.yaml     #创建LB

Kubernetes存储

创建腾讯云CFS

选择与之前创建私有网络相同的地域和可用区。(我之前创建的是广州六区,这里保持一致。)

创建PV以及PVC

新建cfs.yaml文件,创建一个持久卷PV

代码语言:javascript复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: cfs
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - hard
    - nfsvers=4
  nfs:
    path: /
    server: 10.0.0.11   #换成你的文件存储CFS的IP地址

当前目录下执行:

代码语言:javascript复制
kubectl apply -f ./cfs.yaml
kubectl get pv      #获取持久卷的列表,注意此时cfs持久卷的状态

新建一个cfsclaim.yaml文件,创建一个持久卷申领PVC,让PVC绑定之前创建的PV:

代码语言:javascript复制
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cfsclaim
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: ""
  resources:
    requests:
      storage: 10Gi

当前目录下执行

代码语言:javascript复制
kubectl apply -f ./cfsclaim.yaml
kubectl get pv      #获取持久卷的列表,注意此时cfs持久卷的状态

如果返回类似以下信息,STATUS状态为Bound,CLAIMdefault/cfsclaim则表示PVC和PV一一绑定了。

挂载存储并访问应用

新建一个tke-todo.yaml文件,ccr.ccs.tencentyun.com/tkegroup/tke-start:1.0.1 替换成自己的。

镜像仓库 - 容器镜像服务 - 控制台

代码语言:javascript复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tke-todo-deployment
  labels:
    k8s-app: tke-todo
    qcloud-app: tke-todo
spec:
  selector:
    matchLabels:
      k8s-app: tke-todo
      qcloud-app: tke-todo
  replicas: 1 
  template:
    metadata:
      labels:
        k8s-app: tke-todo
        qcloud-app: tke-todo
    spec:
      containers:
      - name: tketodo
        image: ccr.ccs.tencentyun.com/tkegroup/tke-start:1.0.1
        ports:
        - containerPort: 3000
        volumeMounts:
        - mountPath: "/etc/todos"
          name: mypd
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: cfsclaim
      imagePullSecrets:
      - name: qcloudregistrykey        

当前目录下执行:

代码语言:javascript复制
kubectl apply -f ./tke-todo.yaml

tke-todo部署完成后,创建负载均衡CLB,新建文件tke-todo-clb.yaml

代码语言:javascript复制
apiVersion: v1
kind: Service
metadata:
   name: tke-todo-clb
   namespace: default
spec:
   ports:
   - name: tcp-3000-80
     port: 80
     protocol: TCP
     targetPort: 3000
   selector:
     k8s-app: tke-todo
     qcloud-app: tke-todo
   type: LoadBalancer

执行:

代码语言:javascript复制
kubectl apply -f ./tke-todo-clb.yaml

CLB创建完成后,可以在EKS控制台,或者用命令kubectl get services查看公网IP,可以访问服务了。

控制台显示tke-todo-clb还在创建,导致通过ip无法正常访问todo网页。

由于费用关系,我先把这些都删掉,后面有时间再研究下。

总结

这一章的内容稍微有些繁琐,但很多步骤几乎都是相同的,都是创建文件然后应用配置。后续有时间再研究下怎么部署wordpress。

0 人点赞