前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第六章 k8s应用部署

第六章 k8s应用部署

原创
作者头像
喵喵侠
发布2022-01-23 05:34:18
9920
发布2022-01-23 05:34:18
举报
文章被收录于专栏:喵喵学前端喵喵学前端

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。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • YAML与Kubernetes
    • 了解现有的YAML描述文件
      • Kubernetes对象与YAML
      • YAML语法快速入门
        • YAML语法
          • 使用YAML配置文件部署nginx
            • kubectl apply命令
            • 网络、服务与负载均衡
              • 端口转发访问集群中的应用
                • 创建服务Service
                  • 让公网可以访问
                  • Kubernetes存储
                    • 创建腾讯云CFS
                      • 创建PV以及PVC
                        • 挂载存储并访问应用
                        • 总结
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档