Kubernetes基本概念和应用_哔哩哔哩_bilibili
K8s基本概念入门_运维Linux和python-CSDN博客
GitHub - spring2go/spring-petclinic-msa: 微服务版spring-petlinic,课程《Kubernetes微服务实践》
K8S:核心是解决集群资源调度的问题的
在 Mac OS 上搭建 Kubernetes | Zone Of Xiang
1. 下载安装 Docker for Mac
Docker Desktop for Mac release notes | Docker Documentation
Docker Hub 【镜像管理仓库】
如上:这个镜像的最新就是v1.22.4。所以需要保持版本一致
Master:管理和调度集群资源
Worker:资源的提供者 。提供的资源单位是Pod【里面是容器(CPU和内存的资源隔离单位)】,Pod里面可以放置一个或多个容器,如果是多个的话「一个是主容器,其他是辅助容器,同一个Pod里面的容器,共享网络和存储,可以通信」
etcd:分布式的KV数据库,高可用部署的话,至少需要3个节点
API server:K8S的接口和通信总线。是唯一能够访问和操作etcd数据库的 组件
二. Pod
hub.docker.com/r/spring2go/spring-petclinic/tags 【制作一个单体镜像,已经上传到官方的docker hub】
这个镜像启动的时候用的是:嵌入式内存数据库 HSQLDB 【应用可以独立启动,不依赖外部数据库】
默认情况下:K8S集群内部的Pod对外不可见的 【私有环境,有自己的网络,外部无法直接访问】
可以使用端口转发方式暴露内部的服务【仅仅适用于调试和测试环境 】
三、反向代理 - Service
在K8S里面也有一个类似反向代理的抽象概念。【Service】
NodePort相当于可以部署在集群边界上的反向代理
通过NodePort。外部服务就可以访问K8S集群内部的应用。。。
【当前K8S里面的Service还和传统的反向代理不一样,这里的是一个抽象概念】 ,Service将流量反向路由到后端的Pod是通过Selector和Labels机制来实现的。
Labels是一种打标签机制。可以给Pod打上标签(键值对 ,如上:app petclinic)
Selector是一种路由选择机制。如果上面的标签可以和后端Pod的标签匹配上,就可以将流量路由到该Pod上面
Service具有路由转发和负载均衡的能力,可以有效的屏蔽后端ip的变化
适用于K8S集群内部。内部的一种反向代理,微服务应用之间的互通互联 依赖ClusterIP
三. Label和Selector
四、Service
kind: Service 【表示部署一个Service反向代理】
apiVersion:v1 【表示这是K8S的core 核心API】
metadata:【可以给Service起一个名字】
spec/ports:port 80 【这个Service要暴露的port 80】targetPort:对应的Pod的端口【转发】
spec/selector:【指定要选择后端Pod的标签,相当于路由映射配置】
type:【Service的类型。本地K8S环境,不能选择LoadBalancer,只能选择NodePort】LoadBalancer只有公有云才可以支持
上述:31080上面暴露Service,让本机可以访问这个Service
同时:还需要改动这里【为了发布后可以正确路由】
五. 通过Service实现蓝绿发布
Blue-Green-Deployment: 是一种应用升级发布方式,可以瞬间切换到新版本,也可以瞬间回退到老版本。可以做到用户体验不中断
下面以在K8S中升级应用来说明蓝绿发布的过程:
六. 应用集群抽象 ReplicaSet
【务必需要找到对应的版本,不然真的可能会有问题的呢?。。。。】
如上:pod的状态不对。不应该是ErrImagePull。结合des分析之后,发现容器版本写错了1.0.0_RELEASE 。应该是1.0.0.RELEASE。调整后:
请注意:这里的apiVersion应该结合官方文档。
七. 滚动发布抽象 Deployment
滚动发布。在ReplicaSet的基础上再次包装(Deployment)
会始终保证有Pod可用。保证服务的正常运行 。同时前置的Service还是屏蔽后端Pod ip的变化;Deployment的引用:把滚动发布的机制给封装和自动化了
Deployment发布规范:
Kubernetes API Reference Docs
如上:minReadySeconds 10
表示Pod起来后,需要等待10s才算是就绪。这样可以在滚动发布的批次中增加10s的时延,方便我们查看滚动发布的效果
验证滚动发布:
选取一个新镜像。
发布配置
滚动发布中。。。【会生成新的replicaset,不断进行rolling, 新的Pod不断拉入,老的Pod不断停止移除】 整个Deployment已经完成了
查看发布历史: 1代表v1.0.1 2代表v1.0.1
第二条语句代表回退中。从2回退到1【回退的详细情况可以通过如下命令查看】
环境清理:因为说封装的关系
八. K8S内部服务反向代理机制 ClusterIP Service
mysql-pod.yml
apiVersion: v1 kind: Pod metadata: name: mysql labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: petclinic - name: MYSQL_DATABASE value: petclinic
mysql-service.yml
apiVersion: v1 kind: Service metadata: name: mysql spec: selector: app: mysql ports: - name: tcp port: 3306 targetPort: 3306 type: ClusterIP
petclinic-deployment.yml
apiVersion: apps/v1 kind: Deployment metadata: name: petclinic spec: replicas: 1 selector: matchLabels: app: petclinic template: metadata: labels: app: petclinic spec: containers: - name: petclinic image: spring2go/spring-petclinic:1.0.1.RELEASE env: - name: SPRING_PROFILES_ACTIVE value: mysql - name: DATASOURCE_URL value: jdbc:mysql://mysql/petclinic - name: DATASOURCE_PASSWORD value: petclinic - name: DATASOURCE_USERNAME value: root - name: DATASOURCE_INIT_MODE value: always
petclinic-service.yml
apiVersion: v1 kind: Service metadata: name: petclinic spec: ports: - name: http port: 8080 targetPort: 8080 nodePort: 31080 selector: app: petclinic type: NodePort
启动的话,因为有依赖关系,所以需要严格意义上安装上述顺序进行启动
可以通过查看Pod日志,确认PetClinit是否成功启动
kubectl logs petclinic-5f776bbbc4-t6x6z
9. K8S名字空间Namespace和Kube-Dns
内置的k8s DNS.可以完成如上:域名到ip的转化【本质上是查询服务名和IP的映射关系】
petclinic Pod通过内置的DNS client 配合 k8s内置的DNS域名解析服务就可以完成这个目的
名字空间Namespace是K8S中的一种逻辑隔离机制。方便对资源进行逻辑管理。
在一个K8S当中,可以配置多个Namespace。只是逻辑隔离,不是物理隔离。
可以看到内置的名字空间。
default:是缺省名字空间。当前实验的资源就住在default当中
kube-system:k8s运行所需要的一些系统组件。
【这里会有:etcd、apiserver、controller-manager、proxy、scheduler】等等
当petclinic应用准备访问mysql service的时候。Pod内部操作系统自带的DNS client会先查询kube-dns服务。获得mysql ClusterIP对应的ip。然后发起调度
可以通过kubectl连接到petclinic pod上面,运行里面的linux命令,进一步查看域名解析机制
也就是说:上面的pod里面的dns client指向的是nameserver【也就是k8s内置的域名服务】
查看mysql对应的clusterIp 【nslookup mysql】
其中mysql.default.svc.cluster.local是全域名【msyql拼接了搜索域对应的内容 default命名空间下面】
可以看到两者是吻合的。都是对应的上的。。。
清理环境
微服务需要配置管理来针对支持不同环境的灵活的静态或者动态配置
K8S平台内置支持微服务配置。就是ConfigMap。是K8S平台所支持的一种资源
开发人员将配置填写在ConfigMap中。发布以后呢?k8s支持将ConfigMap里的配置以环境变量的形式注入到Pod中 这样Pod里面的应用就可以以环境变量的形式来访问这些应用。。。
ConfigMap也支持以存储卷Volume的形式挂载在Pod中。这样Pod中的应用就可以以本地配置的方式来访问
之前的内容中。为了能让Petclinic Pod能够正常的连接mysql 数据库
在 Petclinic Pod中以环境变量的形式传入了数据库链接字符串的配置参数
这次我们调整一下:不是写在环境变量。而是从ConfigMap里面获取
所以需要先独立部署一个:petclinic-config的ConfigMap【内容就是支持petclinic正常运行所需要的配置项】
petclinic-config.xml
apiVersion: v1 kind: ConfigMap metadata: name: petclinic-config data: SPRING_PROFILES_ACTIVE: mysql DATASOURCE_URL: jdbc:mysql://mysql/petclinic DATASOURCE_PASSWORD: petclinic DATASOURCE_USERNAME: root DATASOURCE_INIT_MODE: always TEST_CONFIG: test_config_v1
mysql-svc.xml
apiVersion: v1 kind: Pod metadata: name: mysql labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: petclinic - name: MYSQL_DATABASE value: petclinic --- apiVersion: v1 kind: Service metadata: name: mysql spec: selector: app: mysql ports: - name: tcp port: 3306 targetPort: 3306 type: ClusterIP
petclinic-svc.xml
apiVersion: apps/v1 kind: Deployment metadata: name: petclinic spec: replicas: 1 selector: matchLabels: app: petclinic template: metadata: labels: app: petclinic spec: containers: - name: petclinic image: spring2go/spring-petclinic:1.0.1.RELEASE envFrom: - configMapRef: name: petclinic-config --- apiVersion: v1 kind: Service metadata: name: petclinic spec: ports: - name: http port: 8080 targetPort: 8080 nodePort: 31080 selector: app: petclinic type: NodePort
两种方式来验证结果的正确性:
1. 查看petclinic的启动日志【kubectl logs petclinic-f77f5c8f-hqp6m】
2. 打开浏览器访问
3. 可以到petclinic pod里面查看环境变量
【kubectl exec petclinic-f77f5c8f-hqp6m printenv】
实际应用当中。经常有配置变更的需求,而且我们希望配置变更以后,应用可以实时或者近实时的获取到更新的配置值
那么问题来了?
如果我变更了Config里面的值,重新发布下,会不会进行传播到应用中呢?【如下:发现并不能进行传播】
方案一:【简单粗暴】
可以delete掉上面的petclinic pod。然后replicaset会重新创建一个。
方案二:【优雅一点的做法】
修改ConfigMap的name和引用
清理工作:
ConfigMap主要针对普通数据
Secret来支持敏感数据配置
Secret是一种特殊的配置。提供较安全的存储和访问配置的机制
会把secret里面的内容以yaml的形式展示出来
启动data里面:已经将结果进行了base64编码【但是,我们可以在metadata里面看到原始值】
也就是说secret的配置值,并没有复杂的加密,并不是特别安全