深入剖析Kubernetes之Kubernetes的基础
Kubernetes是由google和RetHot主导的容器编排工具,已经称为容器编排的标准.Kubernetes源自Google内部的Borg,可以参考这篇文章
概念
Kubernetes是一个对容器进行管理的框架,提供了服务发现和负载均衡、存储编排、自动部署和回滚、自动完成装箱计算、自我修复、密钥与配置管理等功能,可以参考这篇文章
组件
kubernetes的组件分为控制平面组件、Node 组件、插件
控制平面组件
控制平面组件是对集群做出全局决策(比如调度),以及检测和响应集群事件的决策和处理。
Node 组件
Node节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。
插件(Addons)
插件是是对Kubernetes资源(DaemonSet、 Deployment等)实现管理的功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于kube-system命名空间。
部署
Kubernetes的部署工具目前有kubectl、kind、minikube、kubeadm
实例
如何创建一个简单的kubernetes的本地环境
前置准备
-
工具
- minikube
- kubectl
-
步骤
- 安装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
- 启动
- 查看所有namespace下的pod
kubectl get po -A
- 安装仪表盘
minikube dashboard
启动控制台后可以看到
配置文件
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
总结
- kubernetes内部是由四个组件组成
- 控制平面组件
- Node节点组件
- 插件
- 部署工具
- minikube
- kind
- kubeadm
- 配置文件
配置文件将容器中按照集群部署的方式根据应用维度打包形成一个配置文件,后续就可以读取这个配置文件进行启动。这里应用的概念在kubernetes中被称为pod,一个pod是由一个或多个容器组成的。