谷粒商城 集群篇 (三) --------- K8s 入门操作
K8s 入门操作
一、入门操作 K8s 集群
A、部署一个 Tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
Kubectl get pods -o wide
可以获取到 tomcat 信息
B、暴露 nginx 访问
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
Pod 的 80 映射容器的 8080,service 会代理 Pod 的 80
C、动态扩容测试
kubectl get deployment
应用升级 kubectl set image
(–help 查看帮助)
扩容: kubectl scale --replicas=3 deployment tomcat6
扩容了多份,所有无论访问哪个 node 的指定端口,都可以访问到 tomcat6
D、以上操作的 yaml 获取
详见下面
E、删除
Kubectl get all
kubectl delete deploy/nginx
kubectl delete service/nginx-service
流程:创建 deployment 会管理 replicas,replicas 控制 pod 数量,有 pod 故障会自动拉起新的 pod
二、K8s 细节
A、kubectl
文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/
Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。
语法格式:
kubectl [command] [TYPE] [NAME] [flags]
command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete。
TYPE:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
NAME:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:
kubectl get pods
其中输出格式要注意:
-o wide 以纯文本格式输出,包含所有附加信息。对于 Pod 包含节点名
-o yaml 输出 YAML 格式的 API 对象
B、资源类型
文档:https://kubernetes.io/zh-cn/docs/reference/kubectl/#resource-types
我们常见的资源类型有 pods、services、nodes、deployments、roles等
C、格式化输出
文档:https://kubernetes.io/zh-cn/docs/reference/kubectl/#output-options
我们重点关注以 yaml 的格式输出, yaml 的模板如下
D、常用操作
kubectl apply -
以文件或标准输入为准应用或更新资源,例如
# 使用 example-service.yaml 中的定义创建服务。
kubectl apply -f example-service.yaml
kubectl get -
列出一个或多个资源。
# 以纯文本输出格式列出所有 Pod。
kubectl get pods
# 以纯文本输出格式列出所有 Pod,并包含附加信息(如节点名)。
kubectl get pods -o wide
# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>
# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services
# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized
# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01
kubectl describe -
显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>
# 描述所有的 Pod
kubectl describe pods
kubectl delete -
基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源来删除资源。
# 使用 pod.yaml 文件中指定的类型和名称删除 Pod。
kubectl delete -f pod.yaml
# 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和服务。
kubectl delete pods,services -l <label-key>=<label-value>
# 删除所有 Pod,包括未初始化的 Pod。
kubectl delete pods --all
kubectl exec -
对 Pod 中的容器执行命令
# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date
# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date
# 获取一个交互 TTY 并在 Pod <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> -- /bin/bash
kubectl logs -
打印 Pod 中容器的日志
# 返回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name>
# 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
E、命令参考
文档:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
作为对上面常用操作的详细文档。。。主要关注 create 、run命令等。。。
三、Pod 和 Controller
Pod 的共享上下文包括一组 Linux 名字空间、控制组 (cgroup) 和可能一些其他的隔离方面, 即用来隔离容器的技术。 在 Pod 的上下文中,每个独立的应用可能会进一步实施隔离。
Pod 类似于共享名字空间并共享文件系统卷的一组容器。
A、使用 Pod
下面是一个 Pod 示例,它由一个运行镜像 nginx:1.14.2 的容器组成。
pods/simple-pod.yaml :
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
要创建上面显示的 Pod,请运行以下命令:
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
B、Pod 和控制器
你可以使用工作负载资源来创建和管理多个 Pod。 资源的控制器能够处理副本的管理、上线,并在 Pod 失效时提供自愈能力。 例如,如果一个节点失败,控制器注意到该节点上的 Pod 已经停止工作, 就可以创建替换性的 Pod。调度器会将替身 Pod 调度到一个健康的节点执行。
四、Deployment 和 Service
Deployment
如果Pod出现故障,对应的服务也会挂掉,所以Kubernetes提供了一个Deployment的概念 ,目的是让Kubernetes去管理一组Pod的副本,也就是副本集 ,这样就能够保证一定数量的副本一直可用,不会因为某一个Pod挂掉导致整个服务挂掉。Deployment 还负责在 Pod 定义发生变化时,对每个副本进行滚动更新(Rolling Update)。
Service
Pod 是非永久性资源,会动态创建和销毁,pod 的 ip 会变化。这会导致一类Pod (业务1) 访问另一类Pod (业务2) 需要找出并跟踪Pod(业务2)的IP地址,再者Pod(业务2)是多个的,如何提供负载均衡呢?虽然Pod1通过轮询一组Pod的ip可以实现,但会Pod就需要增加负载均衡的逻辑,Pod就变得不纯粹了,不符合单一设计原则。于是有了Service,把一类Pods上的应用程序抽象成服务,并提供可以访问他们的策略。
service 意义
A、部署一个 nginx
kubectl create deployment nginx --image=nginx
B、暴露 nginx 访问
kubectl expose deployment nginx --port=80 --type=NodePort
统一应用访问入口。Service 管理一组 Pod。防止 Pod 失联 (服务发现)、定义一组 Pod 的访问策略。现在 Service 我们使用 NodePort 的方式暴露,这样访问每个节点的端口,都可以访问到这个 Pod,如果节点宕机,就会出现问题。
五、labels 和 selectors
Label是 Kubernetes 系列中另外一个核心概念。是一组绑定到 K8s 资源对象上的 key/value 对。同一个对象的labels属性的 key 必须唯一。label可以附加到各种资源对象上,如Node,Pod,Service,RC等。
通过给指定的资源对象捆绑一个或多个不用的 label 来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。
示例如下:
- 版本标签:
"release" : "stable"
,"release" : "canary"
… - 环境标签:
"environment": "dev"
,"environment" : "production"
- 架构标签:
"tier" : "frontend"
,"tier" : "backend"
,"tier" : "middleware"
- 分区标签:
"partition" : "customerA"
,"partition" : "customerB"
… - 质量管控标签:
"track" : "daily"
,"track" : "weekly"
label-selector:
Label selector 是 Kubernetes 核心的分组机制,通过 label selector 客户端/用户能够识别一组有共同特征或属性的资源对象。
六、Ingress
通过 Service 发现 Pod 进行关联。基于域名访问。
通过 Ingress Controller 实现 Pod 负载均衡。
支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡。
A、部署 Ingress Controller
B、创建 Ingress 规则
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web
spec:
rules:
- host: tomcat6.atguigu.com
http:
paths:
- backend:
serviceName: tomcat6
servicePort: 80
如果再部署了 tomcat8,看效果。
kubectl create deployment tomcat8 --image=tomcat:8.5.51-jdk8
kubectl expose deployment tomcat8 --port=88 --target-port=8080 --type=NodePort
kubectl delete xxx 删除指定资源
随便配置域名对应哪个节点,都可以访问 tomcat6/8;因为所有节点的 ingress-controller 路由表是同步的。
更多推荐
所有评论(0)