一、Docker背景和K8s介绍
1.1 应用部署方式演变
部署方式 | 传统部署 | 虚拟化部署 | 容器化部署 |
---|---|---|---|
概念 | 直接将应用部署在物理机上 | 在一台物理机上运行多个虚拟机,每个虚拟机是一个独立的环境 | 与虚拟机类似,但是共享了操作系统 |
优点 | 简单 | 应用环境不会相互影响,有一定的安全性 | 保证每个容器有自己的文件系统、CPU、内存等 |
缺点 | 很难合理分配资源,一个程序导致内容泄露会影响别的程序 | 增加了操作系统,浪费资源 | / |
三种应用部署方式如下图所示。容器化部署方式,相较于虚拟机部署,不需要新建操作系统,直接复用宿主机的操作系统。
当然,容器化部署也会存在一些问题,比如:
- 一个容器故障停机,如何让另一个容器立刻启动去替补;
- 当并发访问量变大,如何横向扩展容器数量?
这些问题统称为“容器编排”问题,为解决这些容器编排问题,有一些容器编排工具:
- Swarm:Docker自己的容器编排工具
- Mesos:Apache的一个资源统一管控工具,需要和Marathon结合使用
- K8s:谷歌开源的容器编排工具(OpenShift和Rancher是k8s的封装)
1.2 K8s介绍
K8s的本质是一组“服务器集群”,可以在集群的每个节点(服务器)上运行特定的程序,来对节点中的容器进行管理,主要有这些功能:
- 自我修复:某个容器崩溃,能够在一秒内迅速启动新的容器;
- 弹性伸缩:自动对集群中正在运行的容器数量进行调整;
- 服务发现:通过自动发现的形式找到它所依赖的服务;
- 负载均衡:如果一个服务启动了多个容器,能够自动实现请求的负载均衡(轮询)
- 版本回退:如果新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
1.3 K8s组件
1个K8s集群主要是由控制节点(master)、工作节点(node)组成。
master:集群的控制平面,负责集群的决策
- ApiServer:资源操作的唯一入口
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
- 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
- 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod。pod是kubernetes的最小操作单元,容器必须跑在pod中。
- 自此,一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理。这样,外界用户就可以访问集群中的nginx服务了。
1.4 K8s概念
二、集群环境搭建
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.60.100:6443 --token v5hiib.lh23uvi2mokbdo1u \
--discovery-token-ca-cert-hash sha256:2b4f7e703ae46606b4d0e7945098c3e0450baf8914eb93d059456096b559b0c7
[root@master ~]#
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m2s v1.17.4
在kubernetes安装网络插件flannel时,需要下载一个kube-flannel.yml文件,并且要修改其中的quay.io仓库为quay-mirror.qiniu.com。
<