深入剖析Kubernetes之Kubernetes的基础概念


深入剖析Kubernetes之Kubernetes的基础

Kubernetes是由google和RetHot主导的容器编排工具,已经称为容器编排的标准.Kubernetes源自Google内部的Borg,可以参考这篇文章

Borg: Kubernetes 的前身

概念

Kubernetes是一个对容器进行管理的框架,提供了服务发现和负载均衡存储编排自动部署和回滚自动完成装箱计算自我修复密钥与配置管理等功能,可以参考这篇文章

Kubernetes 是什么

组件

kubernetes组件总览

kubernetes的组件分为控制平面组件Node 组件插件

控制平面组件

控制平面组件是对集群做出全局决策(比如调度),以及检测和响应集群事件的决策和处理。

Node 组件

Node节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

插件(Addons)

插件是是对Kubernetes资源(DaemonSet、 Deployment等)实现管理的功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间。

部署

Kubernetes的部署工具目前有kubectlkindminikubekubeadm

kubernetes的部署工具文档

实例

如何创建一个简单的kubernetes的本地环境

前置准备

  • 工具

    1. minikube
    2. kubectl
  • 步骤

    1. 安装minikube
    • 检查是否支持虚拟化

    grep -E --color ‘vmx|svm’ /proc/cpuinfo

    • 安装配置 kubectl
    sudo apt-get update && sudo apt-get install -y apt-transport-https
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    sudo apt-get install -y kubectl
    • 安装minikube
    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    1. 启动
    • 查看所有namespace下的pod

    kubectl get po -A

    • 安装仪表盘

    minikube dashboard

    启动控制台后可以看到
    kubernetes控制台

配置文件

kubernetes不推荐使用命令行来操作容器,而是推荐使用YAML文件来进行配置

下面是一个典型的zk集群的配置文件

  • application/zookeeper/zookeeper.yaml
apiVersion: v1
kind: Service
metadata:
  name: zk-hs
  labels:
    app: zk
spec:
  ports:
  - port: 2888
    name: server
  - port: 3888
    name: leader-election
  clusterIP: None
  selector:
    app: zk
---
apiVersion: v1
kind: Service
metadata:
  name: zk-cs
  labels:
    app: zk
spec:
  ports:
  - port: 2181
    name: client
  selector:
    app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  selector:
    matchLabels:
      app: zk
  maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  selector:
    matchLabels:
      app: zk
  serviceName: zk-hs
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  podManagementPolicy: OrderedReady
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: kubernetes-zookeeper
        imagePullPolicy: Always
        image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
        resources:
          requests:
            memory: "1Gi"
            cpu: "0.5"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        command:
        - sh
        - -c
        - "start-zookeeper \
          --servers=3 \
          --data_dir=/var/lib/zookeeper/data \
          --data_log_dir=/var/lib/zookeeper/data/log \
          --conf_dir=/opt/zookeeper/conf \
          --client_port=2181 \
          --election_port=3888 \
          --server_port=2888 \
          --tick_time=2000 \
          --init_limit=10 \
          --sync_limit=5 \
          --heap=512M \
          --max_client_cnxns=60 \
          --snap_retain_count=3 \
          --purge_interval=12 \
          --max_session_timeout=40000 \
          --min_session_timeout=4000 \
          --log_level=INFO"
        readinessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        livenessProbe:
          exec:
            command:
            - sh
            - -c
            - "zookeeper-ready 2181"
          initialDelaySeconds: 10
          timeoutSeconds: 5
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/zookeeper
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

配置文件以’—'作为容器配置分割符,分别创建了4个容器从而创建一个完整的ZK集群

service/zk-hs created
service/zk-cs created
poddisruptionbudget.policy/zk-pdb created
statefulset.apps/zk created

总结

  1. kubernetes内部是由四个组件组成
  • 控制平面组件
  • Node节点组件
  • 插件
  1. 部署工具
  • minikube
  • kind
  • kubeadm
  1. 配置文件
    配置文件将容器中按照集群部署的方式根据应用维度打包形成一个配置文件,后续就可以读取这个配置文件进行启动。这里应用的概念在kubernetes中被称为pod,一个pod是由一个或多个容器组成的。

参考文档

kubernetes中文官网
kubernetes交互文档
minikube官网
部署运行ZooKeeper集群


  TOC