1. 概述

docker2014年发布第一个版本。

2017年年底之前docker并不支持k8s,因为swarmk8s 是竞争关系,swarmdocker自带的编排工具。

docker swarm分为manager节点和worker节点,manager节点是管理的功能,维持cluster状态并且提供对外的接口,可以通过manager部署appservicesstack等等。

k8s的架构和docker swarm类似,分布式的集群大的方向的架构都是类似的。都是有managerworker,只不过在kubernetsmanager叫做master节点,worker叫做node,就是单纯的node节点。

master对外提供接口,可以对整个kubernets集群进行操作。

1. master

masterk8s的大脑,主要功能API Server是暴露给外界访问的。可以通过CLI或者UI去操作API Service然后和整个集群进行交互操作。

Scheduler实现调度工作,假设通过API下达一个命令部署应用,这个应用需要两个容器,那这两个容器到底要运行在那个节点上去,这个就是Scheduler通过一些调度算法来决定运行在哪个节点。

Controller是一个控制,比如说容器要做一个负载均衡,要做一个扩展,控制运行个数等等。

最底层有一个etcd,他是一个分布式的key-value-store,就是一个存储,存储整个k8s的状态和配置。

2. node

node里面重要的一个概念是pod, pod是容器调度的最小单位,pod指的是具有相同的name space的一些container的组合。

name space包含所有的name space, 比如说user-name-space, net-name-space, 其实主要还是network name space

具有相同的network name space组合,容器可能有一个也可能有多个,如果是多个的话他们是共享一个network space

Dockerkubeletkube-proxy, fluentd

docker是容器组件,kubeletmaster节点控制node节点的代理桥梁。kube-proxy和网络有关主要做端口的代理和转发,负载均衡等功能。fluentd主要是日志的采集,存储和查询。

2. 安装

minikube可以快速在本地搭建一个只有一个节点的集群,这个节点既是master又是worker,可以使用他来进行学习。这个工具可以用在linuxmacOSwindows

kubeadm可以方便的在本地搭建一个真正的k8s集群,有多个节点,至少一个master,一个 workder,节点是可选的。当然节点越多需要的资源也就越多。他的使用要复杂一些。

现在很多云服务商都会提供搭建k8s的服务,只需要简单的UI界面操作就可以了。比如阿里云,谷歌云等等。

1. 在mac上安装

使用minikube来演示 https://minikube.sigs.k8s.io/docs/start/, 安装还是比较简单的。

国内的阿里云上也存在很多的可安装的方式。

minikube version

启动minikube, 这个启动可能会失败,因为服务在国外,可以参考上面的文档设置国内镜像。

minikube start

创建之后会在VBox(这里用的虚拟机)里面创建一台虚拟机,然后会创建很多的container和镜像,这需要一些时间,耐心等待就可以了。

# 查看状态
minikube status
# 进入到创建的虚拟机里面
minikube ssh
# 查看容器
docker ps

安装kubectl,他可以获取集群的运行信息和创建k8s的资源,比如poddevelopment

安装

# 查看信息
kubectl version
# 查看k8s的pod,这里面展示的都是一些核心的组件,是他们组成了k8s
kubectl get pod --all-namespaces

停止minikube

# 停止
minikube stop
# 删除
minikube delete
# 启动dashboard服务,可以通过网页访问k8s集群
minikube dashboard

3. Kubernetes中的基本概念和操作

kubectl有一个自动补全的方法completion,可以使用--help查询设置方法

kubectl completion --help

设置之后使用tab按键就会出现提示方法。

kubectl默认会查看.kube下面的config文件来操作k8s, 也可以自己设置这个config中的设置来管理k8s的操作。可以通过config命令查看。

kubectl config current-context
kubectl config get-contexts

切换context, 可以将不同的cluster配置到config中,然后通过切换来设置不同的操作。

kubectl config use-context [kubeadm]

4. 节点和标签

master节点上会运行核心的功能,比如调度器,在node节点运行的是部署应用。

# 查询当前有哪些节点
kubectl get node
# 查询指定节点
kubectl get node k8s-master
# 查询指定节点的详细信息
kubectl describe node k8s-master

一般很少查看node的详细信息,可以通过-o 添加参数,输出更多的信息。 wide或者yamljson

kubectl get node -o wide

node中有个东西叫做label,标签。用于分组, 可以使用下面的命令查看labellabel一般是键值对类型。

# 查看label
get node --show-labels
# 设置label
kubectl label node k8s-master env=test
# 删除label,name-
kubectl label node k8s-master env-

ROLES是角色,默认只有master具有角色,node不存在角色,这个是不对的,roles是一种特殊的label,也可以设置他。

# 设置node1的roles
kubectl label node k8s-node1 node-role.kubernetes.io/worker=

5. pod

一个或者一组应用容器,他们分享资源比如volume,分享相同的命名空间的容器,如网络空间。podk8s里面的最小调度单位,在k8s里面不会直接操作container,而是操作pod,一个pod可能包含多个container。因为pod共享一个name space, 所以它里面的container可以直接localhost通信。

创建pod要通过yml文件,类似下面的方式, 这里的kingpod, 这个spec里面要声明展示几个container。这里启动了nginxbusybox两个container,他们是可以互相通信的。

apiVersion: v1
kind: pod
metadata:
    name: nginx-busybox
spec:
    containers:
    - name: nginx
        image: nginx
        ports:
        - containerPort: 80
    - name: busybox
        image: busybox
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo hello; sleep 10; done"]

有了这个文件就可以通过kubectl创建pod了。-f指定配置文件,

kubectl create -f nginx_busybox.yml

创建之后可以对pod进行操作。

# 查看pod, 会显示pod的状态和里面container的状态
kubectl get pods
# 获取pod的详细信息
kubectl describe pod nginx-busybox
# 返回更多的信息,ip地址等
kubectl get pods nginx-busybox -o wide
# 进入到pod里面的container里,如果有多个container默认会进入到第一个里面
kubectl exec nginx-busybox -it sh
# 可以通过-c参数指定进入那个container
kubectl exec nginx-busybox -c nginx -it sh
# 删除掉pod
kubectl delete -f nginx_busybox.yml

6. mamespace命名空间

namespace命名空间用于不同team,不同project之间的隔离,在不同的命名空间中,各种资源的名字是相互独立,比如可以具有相同名称的pod存在。

可以通过kubectl获取到当前系统与有那些namespace, 默认情况下会有defaultpublicsystemlease四个namespace

kubectl get namespace

如果要创建namespace可以直接通过create就可以了。

kubectl create namespace demo

有了namespace就可以非常方便的根据namespace对资源进行过滤。

kubectl get pod --namespace kube-system

可以在yml中指定创建的pod所在的namespace, 通过namespace关键字,如果不指定系统会默认把namespace放在default里面。

metadata:
    name: nginx
    namespace: demo

查看所有的namespace

kubectl get pod --all-namespaces

7. 创建自己的context

可以通过设置改变当前默认的namespace,这就可以通过context去实现,其实他就是kubectlconfig

# 创建
kubectl config set-context demo --user=minikube --cluster=minikube --namespace=demo
# 设置
kubectl config use-context demo
# 查看
kubectl config get-contexts
# 删除,要保证不在当前要删除的context中
kubectl config delete=context demo

转载须知

如转载必须标明文章出处文章名称文章作者,格式如下:

转自:【致前端 - https://madaozhijian.com】 Kubernetes介绍和使用  "隐冬"