在学习了docker容器之后必然要学习容器的编排技术,我选择学习了kubernetes,因为很多公司都在选择使用它,准备在公司新项目中使用它。
一.了解kubernetes
kubernetes在业内简称k8s(这个8是中间8个单词的缩写),kubernets能做什么,为什么要用它?我总结了下使用它的优点有以下几个:
1.具有完备的容器集群管理能力
2.能够自我修复和故障发现
3.滚动升级和随时扩容缩容
4.资源自动合理分配能力
二.kubernets组件和架构
kubernets集群也是一个c/s的模型,分master(管理节点服务器) 和 node(节点服务器)
以自己的理解我画了一个它的组件分布图(单纯属于自己理解来画的,我不保证我的理解很正确)
各组件作用:
1.Kubernetes API Server:Kubernetes系统的入口,其封装了核心对象的增删改查操作,以RESTful API接口方式提供给外部客户和内部组件调用。维护的REST对象持久化到Etcd中存储.
2.Kubernetes Scheduler:为新建立的Pod进行节点(node)选择(即分配机器),负责集群的资源调度。组件抽离,可以方便替换成其他调度器。
3.Kubernetes Controller:负责执行各种控制器,目前已经提供了很多控制器(rc/rs/deployment)来保证Kubernetes的正常运行。
4. Replication Controller(rc):管理维护Replication Controller,关联Replication Controller和Pod,保证Replication Controller定义的副本数量与实际运行Pod数量一致。还有k8s还提供了rc的升级版rs和deployment。
5. Service:基于虚拟IP的网桥的服务,这个服务会将请求转发到对应的后台pod。
6.etcd:高可用存储共享配置和服务发现,作为与minion机器上的flannel配套使用,作用是使每台 minion上运行的docker拥有不同的ip段.
7.kube-proxy:kubernetes 里运行在node节点上的一个组件, 它起的作用是一个服务代理的角色
8. Kubelet:运行在Kubernetes Minion Node上. 它是container agent的逻辑继任者
9.pod:运行于Node节点上,若干相关容器的组合。
三.kubernetes集群实践
以spring-boot项目用k8s+docker+jenkins的部署方案在虚拟机上进行了实践,下面是我的实践过程
1.虚拟机部署情况
虚拟机 | 应用搭建及用途信息 |
centos 192.168.137.3 | docker私有镜像仓库,jenkins,k8s的master管理节点 |
centos 192.168.137.4 | k8s的node节点1 |
centos 192.168.137.5 | k8s的node节点2 |
2.部署过程图
3.自定义pod及service模板
第一次我们可能会手动去创建pod
cortp-deployed.yaml如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cortpweb-deployment
labels:
name: cortpwebapp-deployment
spec:
replicas: 2
template:
metadata:
labels:
name: cortpweb-deployment-pod
spec:
containers:
- name: spring-boot
image: centos/spring-boot:16
ports:
- containerPort: 8081
volumeMounts:
- name: h5
mountPath: /usr/local/java/web
volumes:
- name: h5
hostPath:
path: /home/docker
cortp-service.yaml如下:
apiVersion: v1
kind: Service
metadata:
name: cortpweb-service-deployed
labels:
name: cortpwebapp-service-deployed
spec:
type: NodePort
ports:
- port: 8008
targetPort: 8081
protocol: TCP
nodePort: 30000
selector:
name: cortpweb-deployment-pod
如果要更新镜像centos/spring-boot:17时可执行如下:
kubectl set image deployment/cortpweb-deployment spring-boot=centos/spring-boot:17
使用命令可查看历史升级命令:
kubectl rollout history deployment/cortpweb-deployment
回滚到上个版本:
kubectl rollout undo deployment/cortpweb-deployment --to-revision=2
顺便说下如果nodeport映射外网无法访问有可能是因为防火墙禁止端口转发的问题:iptables -P FORWARD ACCEPT即可
这里要再提及几个命令:
扩容:kubectl scale deployment cortpweb-deployment --replicas 4
查看所有pod运行情况:kubectl get pods --all-namespaces -o wide
查看所有service 运行情况:kubectl get services --all-namespaces
查看pod启动信息:kubectl describe pods/cortpweb-deployment-e18df --namespace=kube-system
查看pod启动日志:kubectl logs cortpweb-deployment-e18df -c spring-boot --namespace=kube-system (命名空间不指定就是default或者所有命名空间 --all-namespaces)
注:我在搭建集群的时候遇到各种坑,如不同节点的pod ip网络不通(执行iptables -F和iptables -t nat -F重启docker后ok了)
还有安装kubeDNS后用busybox执行 kubectl exec -it busybox nslookup kubernetes.default来验证是否能够解析成功发现报错:nslookup: can't resolve 'kubernetes.default',最后发现是是busybox的问题