1、K8sK8s部署操作一、K8s总体架构l通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd,接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,随后,目标Node上运行的Kubelet进程通过API Ser
2、ver监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。l随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求,Controller Manager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过API Server写入到etcd中,接下来,所有Node上运行的Proxy进程通过API Server查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。组件简述letcd 用
3、于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。lAPI Server 提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。lController Manager 集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保
4、Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。组件简述lScheduler 集群中的调度器,负责Pod在集群节点中的调度分配。lKubelet 负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。lProxy 实现了Service的代理与软件模式的负载均衡器。二、基本概念lMaster Kub
5、ernetes里的Master指的是集群控制节点,每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都是发给它,它来负责具体的执行过程。我们后面所有执行的命令基本都是在Master节点运行的。Master节点通过占据一个服务器,一个主要的原因是它太重要了,它是整个集群的“首脑”,如果它宕机或者不可用,那么我们所有的控制命令都将失效。lNode 除了Master,Kubernetes集群中的其它机器被称为Node节点,在较早的版本中也被称为Minion。与Master一样,Node节点的可以是一台物理主机,也可以是一台虚拟
6、机。Node节点才是Kubernetes集群中的工作负载节点。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载将会被Master自动转移到其它节点上。PodlPod是Kubernetes最重要也是基本的概念,其组成结构如右图所示。它包含一个Pause容器和多个用户业务容器。lPause容器的作用: (1)代表整个容器组的状态。 (2)Pod里的多个业务共享Paush容器的IP,共 享Paush容器挂接Volume。既解决了密切相关的业务容器之间的通信问题,又解决了它们之间的文件共享问题。RCl全称“Replication Controll
7、er”,中文名“副本控制器”。lRC是Kubernetes系统中的核心概念之一,简单来说,它其实定义了一个期望的场景,即声明某种Pod的副本数量在在任意时刻都符合某个预期值。lRC的定义包括如下几个部分: (1)Pod期待的副本数(replicas) (2)用于筛选目标Pod的Label Selector (3)当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)ServicelService也是Kubernetes里最核心的资源对象之一,它定义了一个服务的访问入口地址,前端的应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,Service
8、与其后端Pod副本集群之间则是通过Label Selector来实现“无缝对接”的。而RC的作用实际上是保证了Service的服务能力和服务质量始终处于一预期的标准。l下图为Pod、RC与Service的关系图三、实际操作l1.创建创建MySql rc文件:文件:mysql-master-rc.yaml svc文件:文件:mysql-master-svc.yamll2.创建创建Eureka、Zuul、Hystrix、Config四个服务中心四个服务中心 rc文件:文件:qishon-center-master-rc.yaml svc文件:文件:config-svc.yaml、eureka-sv
9、c.yaml、hystrix-svc.yaml、zuul-svc.yaml在在Master主机上通过命令操作文件可以创建或删除主机上通过命令操作文件可以创建或删除RC和和SVC。常用命令lnode kubectl get nodes = 查看集群中的主机 kubectl -s http:/:8080 get node kubectl describe node ip|hostname =查看指定主机详细信息lRC kubectl create -f xxxx-rc.yaml =通过文件创建rc和对应pod kubectl delete-f xxxx-rc.yaml =通过文件删除rc和对应的p
10、od kubectl get rc =查看已经存在的rc kubectl delete rc rc_name = 删除指定名称的rc kubectl describe rc rc_name =查看指定rc详情常用命令lPodkubectl get pods =查看已经创建的所有podkubectl delete pod pod_name =删除指定名称的podkubectl describe pod pod_namej =查看指定名称的pod详情kubectl logs pod_name =查看POD的容器日志(单容器)kubectl logs -f pod_name=查看POD的容器日志(单
11、容器,实时)kubectl logs pod_name container_name =查看POD中指定容器的日志(多容器)kubectl logs -f pod_name container_name =查看POD中指定容器的日志(多容器,实时)常用命令lsvckubectl create -f xxxx-svcyaml =通过文件创建svckubectl delete-f xxxx-svc.yaml =通过文件删除svckubectl get svc =查看所有svckubectl describe svc svc_name =查看指定名称的svc详情kubectl expose rc r
12、c_metadata_name =通过rc创建一个svckubectl delete svc svc_name =删除指定的svcmysql-master-rc.yaml1.apiVersion: v12.kind: ReplicationController3.metadata:4. name: mysql-master5. labels:6. name: mysql-master7.spec:8. replicas: 19. selector:10. name: mysql-master11. template:12. metadata:13. labels:14. name: mysql
13、-master15. spec:16. containers:17. - name: mysql18. image: mysql:latest19. volumeMounts:20. - mountPath: /var/lib/mysql21. name: mysqldb22. imagePullPolicy: IfNotPresent23. ports:24. - containerPort: 330625. env:26. - name: MYSQL_ROOT_PASSWORD27. value: 12345628. #指定目标node调度pod29. nodeSelector:30. z
14、one: node6031. volumes:32. - name: mysqldb33. hostPath:34. path: /home/volume/mysqlmysql-master-svc.yaml1.apiVersion: v12.kind: Service3.metadata:4. name: mysql5.# labels:6.# name: mysql-master7.spec:8. type: NodePort9. ports:10. - port: 330611. nodePort: 330612. selector:13. name: mysql-masterqisho
15、n-center-master-rc.yaml1.apiVersion: v12.kind: ReplicationController3.metadata:4. name: qscenter5.spec:6. replicas: 17. selector:8. name: qscenter9. template:10. metadata:11. labels:12. name: qscenter13. spec:14. containers:15. - name: eureka-server16. image: qishon/eureka-server:latest17. imagePull
16、Policy: IfNotPresent18. ports:19. - containerPort: 111120. env:21. - name: EUREKA_HOST22. value: localhost23. - name: config-server24. image: qishon/config-server:latest25. imagePullPolicy: IfNotPresent26. ports:27. - containerPort: 700128. env:29. - name: EUREKA_HOST30. value: localhost31. - name:
17、zuul-proxy32. image: qishon/zuul-proxy:latest33. imagePullPolicy: IfNotPresent34. ports:35. - containerPort: 707036. env:37. - name: EUREKA_HOST38. value: localhost39. - name: CONFING_HOST40. value: localhost41. - name: hystrix-dashboard42. image: qishon/hystrix-dashoboard:latest43. imagePullPolicy:
18、 IfNotPresent44. ports:45. - containerPort: 200546. #指定目标node调度pod47. nodeSelector:48. zone: node60eureka-svc.yaml1.apiVersion: v12.kind: Service3.metadata:4. name: eureka-server5.spec:6. type: NodePort7. ports:8. - port: 11119. nodePort: 111110. selector:11. name: qscenterhystrix-svc.yaml1.apiVersi
19、on: v12.kind: Service3.metadata:4. name: hystrix-dashboard5.spec:6. type: NodePort7. ports:8. - port: 20059. nodePort: 200510. selector:11. name: qscenterconfig-svc.yaml1.apiVersion: v12.kind: Service3.metadata:4. name: config-server5.spec:6. type: NodePort7. ports:8. - port: 70019. nodePort: 700110. selector:11. name: qscenterzuul-svc.yaml1.apiVersion: v12.kind: Service3.metadata:4. name: zuul-proxy5.spec:6. type: NodePort7. ports:8. - port: 70709. nodePort: 707010. selector:11. name: qscenterOver