一 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 账户登录