目录
一 k8s 支持的语言格式
1,YAML 语法格式
2,查看 api 资源版本标签
二 k8s 运行nginx pod实例 yaml文件 具体讲解
1,写一个yaml文件demo
2,deployment 管理nginx 的yaml 文件
3,创建资源对象
4,查看创建的pod资源
5,创建service服务对外提供访问并测试
6,创建service资源对象
7,查看创建的service
8,验证结果
三 快速写yaml 文件方法
1,用 --dry-run 命令 创建但不执行
2, 查看生成yaml格式
3, 查看生成json格式
4, 使用yaml格式导出生成模板
5, 将现有的资源生成模板导出
6, 保存到文件中
7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息
四 实战演练
1,用yaml 文件 k8s 运行nginx的pod实例
1.1 实验需求
1.2 创建命名空间
1.3 创建pod 实例
1.4 创建service
1.5 修改得到的yaml 文件
1.6 执行yaml 文件
1.7 查看结果
1.8 进容器 做页面
1.9 访问 nginx
2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)
2.1 用deployment 控制器创造 redis 实例
2.2 暴露端口
2.3 修改yaml 文件
2.4 执行yaml 文件
2.5 访问 redis
3, 用yaml 文件 k8s 运行mysql 的pod实例
3.1 报错分析
3.2 查看pod 日志
3.3 解决办法
或者
3.4 修改yaml 文件
3.5 执行yaml 文件
3.6 进入mysql 的容器,用root 登录
一 k8s 支持的语言格式
Kubernetes 支持 YAML 和 JSON 格式管理资源对象
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
1,YAML 语法格式
●大小写敏感
●使用缩进表示层级关系
●不支持Tab键制表符缩进,只使用空格缩进
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
●“---”表示YAML格式,一个文件的开始,用于分隔文件间
●“#”表示注释
2,查看 api 资源版本标签
kubectl api-versions
命令帮助用户了解其 Kubernetes 集群所支持的 API 资源及版本范围,是管理和操作集群时的一个有用的信息参考点。
kubectl api-versions
如果是业务场景一般首选使用 apps/v1
带有beta字样的代表的是测试版本,不用在生产环境中
二 k8s 运行nginx pod实例 yaml文件 具体讲解
1,写一个yaml文件demo
mkdir /opt/demo
cd demo/
vim nginx-deployment.yaml
2,deployment 管理nginx 的yaml 文件
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义Deployment资源标签
app: nginx
spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
replicas: 3 #定义副本数量
selector: #定义标签选择器
matchLabels: #定义匹配标签
app: nginx #需与 .spec.template.metadata.labels 定义的标签保持一致
template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
metadata:
labels: #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
app: nginx
spec:
containers: #定义容器属性
- name: nginx #定义一个容器名,一个 - name: 定义一个容器
image: nginx:1.15.4 #定义容器使用的镜像以及版本
ports:
- containerPort: 80 #定义容器的对外的端口
详解k8s中的port:
●port
port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service●nodePort
nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service。●targetPort
targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器。●containerPort
containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort。
即我要指定暴露nginx的端口,就在yaml 文件中指定nodeport
3,创建资源对象
kubectl create -f nginx-deployment.yaml
4,查看创建的pod资源
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-deployment-d55b94fd-29qk2 1/1 Running 0 7m9s 172.17.36.4 192.168.80.12 <none>
nginx-deployment-d55b94fd-9j42r 1/1 Running 0 7m9s 172.17.36.3 192.168.80.12 <none>
nginx-deployment-d55b94fd-ksl6l 1/1 Running 0 7m9s 172.17.26.3 192.168.80.11 <none>
5,创建service服务对外提供访问并测试
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
6,创建service资源对象
kubectl create -f nginx-service.yaml
7,查看创建的service
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 16d
nginx-service NodePort 10.0.0.119 <none> 80:35680/TCP 14s
8,验证结果
在浏览器输入 nodeIP:nodePort 即可访问
http://192.168.80.11:35680
http://192.168.80.12:35680
三 快速写yaml 文件方法
1,用 --dry-run 命令 创建但不执行
创建自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client
创建无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client
2, 查看生成yaml格式
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml
3, 查看生成json格式
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json
4, 使用yaml格式导出生成模板
并进行修改以及删除一些不必要的参数
自主状态pod
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml
无状态pod
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml > nginx-deploy.yaml
5, 将现有的资源生成模板导出
kubectl get svc nginx-service -o yaml
6, 保存到文件中
kubectl get svc nginx-service -o yaml > my-svc.yaml
7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息
这个很重要,比如不知道deployment 的yaml 文件怎么写,可以输入 kubectl explain deployment
下面会提示你需要哪些信息
kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers
四 实战演练
1,用yaml 文件 k8s 运行nginx的pod实例
1.1 实验需求
1.2 创建命名空间
kubectl create ns my-ky35 --dry-run=client -o yaml >nginx.yaml
1.3 创建pod 实例
kubectl run my-nginx-ky35 --image=nginx:1.14 --port=80 --labels=njzb=my-ky35 --dry-run=client -n my-ky35 -o yaml >> nginx.yaml
1.4 创建service
kubectl expose pod my-nginx-ky35 --port=80 --target-port=80 --name=nginx01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>nginx.yaml
tips: 此步骤 要先有命令空间 和 pod 实例
此步骤只是要 暴露端口的yaml语言
1.5 修改得到的yaml 文件
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: my-ky35
spec: {}
status: {}
---
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: my-nginx-ky35
namespace: my-ky35
spec:
containers:
- image: nginx:1.14
name: my-nginx-ky35
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: nginx01
namespace: my-ky35
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
njzb: my-ky35
type: NodePort
status:
loadBalancer: {}
tips:
1.6 执行yaml 文件
kubectl apply -f nginx.yaml
1.7 查看结果
1.8 进容器 做页面
kubectl exec -it my-nginx-ky35 -n my-ky35 bash
1.9 访问 nginx
2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)
2.1 用deployment 控制器创造 redis 实例
kubectl create deployment my-redis-wyq --image=redis:latest --port=6379 --dry-run=client -n my-ky35 -o yaml >> redis.yaml
2.2 暴露端口
kubectl expose deployment my-redis-wyq --port=6379 --target-port=6379 --name=redis01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>redis.yaml
注意:这边是创造的deployment
所以不论暴露端口还是 删除 都是指定deployment 名字
2.3 修改yaml 文件
在两个apiVersion: apps/v1 中间加 ---
在暴露端口的那段yaml 文件 指定命名空间
添加nodeport 指定暴露端口
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: my-redis-wyq
namespace: my-ky35
spec:
replicas: 1
selector:
matchLabels:
app: my-redis-wyq
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
spec:
containers:
- image: redis:latest
name: redis
ports:
- containerPort: 6379
resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: redis01
namespace: my-ky35
spec:
ports:
- port: 6379
protocol: TCP
nodePort: 32333
targetPort: 6379
selector:
app: my-redis-wyq
type: NodePort
status:
loadBalancer: {}
2.4 执行yaml 文件
kubectl apply -f redis.yaml
2.5 访问 redis
连接redis 测试
3, 用yaml 文件 k8s 运行mysql 的pod实例
3.1 报错分析
和上述步骤一样时会报错。报错如下:
CrashLoopBackOff
是 Kubernetes 中的一个状态,表明 Pod 内的容器反复启动后立即退出(崩溃),然后 Kubernetes 会按照重启策略(通常默认是重启)不断地尝试重新启动容器。这种状况通常是由于容器内的应用运行时出现错误,导致进程非正常终止。
3.2 查看pod 日志
在master01
查看日志
kubectl logs my-mysql-wyq-99f66bcc-dbjvf -n my-ky35
因为 MySQL 服务容器在启动时遇到问题,因为它发现数据库还没有被初始化,并且您没有提供必要的环境变量来设定 root 用户的密码。MySQL 容器要求在首次启动时明确指定关于 root 密码的处理方式
3.3 解决办法
可以通过设置 MYSQL_ROOT_PASSWORD
环境变量来指定 root 用户的密码
env:
- name: MYSQL_ROOT_PASSWORD
value: "your_strong_password_here"
或者
允许 root 用户密码为空
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
3.4 修改yaml 文件
要修改的地方:
允许mysql 的root 密码为空
代码展示如下:
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
name: my-mysql-wyq
namespace: my-ky35
spec:
replicas: 1
selector:
matchLabels:
app: my-mysql-wyq
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
spec:
containers:
- image: mysql:latest
name: mysql
ports:
- containerPort: 3306
resources: {}
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
name: mysql01
namespace: my-ky35
spec:
ports:
- port: 3306
nodePort: 31111
protocol: TCP
targetPort: 3306
selector:
app: my-mysql-wyq
type: NodePort
status:
loadBalancer: {}
3.5 执行yaml 文件
3.6 进入mysql 的容器,用root 登录
mysql 准备好了
进入该pod
使用root 账户登录