谷粒商城 集群篇 (三) --------- 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、常用操作

文档:
https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E7%A4%BA%E4%BE%8B-%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值