Kubernetes集群学习

在学习了docker容器之后必然要学习容器的编排技术,我选择学习了kubernetes,因为很多公司都在选择使用它不学我怕跳槽后找工作问到这个就GG了,准备在公司新项目中使用它。

一.了解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的问题

猜你喜欢

转载自blog.csdn.net/Despredao/article/details/82495105
今日推荐