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-versions
和kubectl api-resources
来查询Kubernetes API支持的API版本以及资源对象。
kubectl api-versions
kubectl api-resources
kubectl api-resources -o wide #可以了解不同的资源对象的API版本、kind类型、资源对象的简称等
Kubernetes对象与YAML
kubectl explain
命令来了解API对象有哪些属性
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
支持单文件、多文件、外部链接
# 通过单个文件创建资源对象
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
,然后在当前目录下打开终端:
kubectl apply -f ./nginx-service.yaml #创建一个service
kubectl get services
kubectl describe service nginx-service
minikube service
返回一个URL来访问访问服务。
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
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:
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
,CLAIM
为default/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
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。