kubernetes笔记

第一章

作用

  1. 弹性伸缩
  2. 滚动升级
  3. 解决了容器的端口冲突问题(个人理解)

kubernetes是一个容器编排工具,其针对服务的容器化部署进行统一的编排调度。k8s可以实现,流量高峰期的自动扩容,应用版本升级时的不停机更新,重点解决的是容器的统一部署出现的IP冲突问题。

另一种实现思想:使用nginx做统一访问入口,通过监控nginx的访问日志监控,如果发现短时间的大量访问,则调用创建并启动新的应用容器,待容器启动成功后,更新nginx配置,nginx -s reload, 不重启更新,通过nginx的负载均衡策略将流量分配到新的容器上,在整个升级更新的过程中,用户不会发现应用已经发生了变化,session使用redis进行统一存储,解决用户掉线问题。

安装部署

yum install etcd kubernetes ##安装
systemctl start etcd		##启动文件系统
systemctl start docker 		##启动docker
systemctl start kube-apiserver	#启动api-server(核心组件),资源调度器
systemctl start kube-controller-manager		##启动访问控制器
systemctl start kube-scheduler				##低筒任务调度器
systemctl start kubelet						##启动?
systemctl start kube-proxy					##启动代理网络服务(重点)

示例

定义mysql-rc.yaml

apiVersion: v1
kind: ReplicationController				##类型,副本控制器
metadata:		
  name: mysql							##rc名称
spec:
  replicas: 1							##副本数量
  selector:
    app: mysql							##标签选择
  template:								##模板
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

执行指令kubectl create -f mysql-rc.yaml创建该rc,执行kubectl get rc查询rc

根据rc(副本控制器)创建pod,这是推荐的步骤,也可以直接创建pod,但是没有rc控制器进行副本数量管理,不够安全。

定义mysql-svc.yaml

apiVersion: v1
kind: Service					##类型, service
metadata:
  name: mysql					##service的全局名称
spec:
  ports:
    - port: 3306
  selector:
    app: mysql					##与上一步的rc中的标签一致

执行指令kubectl create -f mysql-svc.yaml创建服务,执行kubectl get svc查看服务

服务service是pod的抽象,服务中定义的标点来自pod中,由rc定义。

定义t myweb-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  #Pod的数量
  replicas: 2
  #spec.selector与spec.template.metadata.labels,这两个字段必须相同,否则下一步创建RC会失败。
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
   #容器组的定义
    spec:
      containers:
        #容器名称
        - name: myweb
          #容器对应的镜像
          image: kubeguide/tomcat-app:v1
          ports:
        #在8080端口上启动容器进程,PodIP与容器端口组成Endpoint,代表着一个服务进程对外通信的地址
          - containerPort: 8080
          env:
        #此处如果在未安装域名解析的情况下,会无法将mysql对应的IP解析到env环境变量中,因此先注释掉!
        # - name: MYSQL_SERVICE_HOST
        #   value: 'mysql'
        # - name: MYSQL_SERVICE_PORT
        #   value: '3306'

执行指令kubectl create -f myweb-rc.yaml创建服务。

概念理解

pod

pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个)容器(例如 Docker 容器),这些容器有共享存储、网络、以及怎样运行这些容器的声明。Pod 的内容总是共同定位和共同调度,并且在共享的上下文中运行。 Pod 以特定于应用的“逻辑主机”为模型,它包含一个或多个应用容器,这些容器是相对紧密的耦合在一起;在容器出现之前,在相同的物理机或虚拟机上运行意味着在相同的逻辑主机上运行。

简言之:容器的集合,一组容器,容器共生命周期

rc

replicas conroller 副本控制器,控制集群中的同一个资源的副本数量,先定义rc,有rc调度生成pod

简言之:资源的定义

service

服务,对外暴露提供的服务,受制于pod,是pod的集合

简言之:业务服务

deployment

rc的升级版

node

节点,集群由多个节点参与,一个node对应一个物理主机,node之间的通信通过ip实现。node由集群管理,实现物理主机cpu和io资源的统一调度。

简言之:物理主机

第二章