如果想要在Docker上部署大型应用,首先就是要解决网络的问题,还有一系列复杂的问题,包括集群管理,负载均衡等。此时就需要容器编排部署工具来解决这些问题。
一、容器编排部署工具
容器管理工具可以完成容器的基础管理,但是容器的应用并不是只能进行简单应用部署的,可以使用容器完成企业中更加复杂的应用部署,当需要对多应用的系统进行部署时,就需要更加复杂的工具来完成对容器运行应用的编排,这就是容器编排部署工具。
容器编排部署工具有:
(1)docker三剑客:docker machine、docker compose、docker swarm
(2)mesos+marathon
(3)kubernetes
二、Kubernetes介绍
kubernetes简称为k8s,8是因为k和s之间有8个字母,是谷歌内部的Borg系统的开源版本,也是目前主流的容器编排部署工具。
k8s是一个轻便的和可扩展的开源平台,用于管理多个主机上的容器化的应用,让部署容器化的应用简单并且高效,提供了应用部署、规划、更新、维护的一种机制,能进行应用的自动化部署及扩缩容。
如上图所示,k8s集群是Master和Worker的模式。
Master节点上有kube-apiserver、kube-controller-mansger、kube-scheduler以及etcd进程,分别用于接收客户端请求并控制集群、资源对象的控制中心并监控容器健康、资源调度、资源对象数据存储等功能。
Worker节点上有kubelet、kube-proxy、docker,分别用于管理Pod及Pod容器并定时向Master汇报节点资源信息、实现Service的透明代理及负载均衡、运行容器。
三、k8s主要功能介绍
(1)自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
(2)自我修复
当容器失败时,会对容器进行重启
当所部署的Node节点宕机时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器,直到容器正常运行时,才会对外提供服务。
(3)水平扩展
通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行扩容或缩容
(4)服务发现
不需要使用额外的服务发现机制,k8s自身具备服务发现和负载均衡
(5)滚动更新
可根据应用的变化,对应用容器运行的应用,进行一次性或批量的更新
(6)版本回退
可根据应用部署情况,对应用容器运行的应用,进行历史版本回退
(7)密钥和配置管理
在不需要重新构建镜像的情况下,可以部署、更新密钥和应用配置,类似热部署
(8)存储编排
自动实现存储系统挂载及应用,特别对有状态应用应用实现数据持久化特别重要
存储系统可以是本地目录,网络存储、公共云存储服务等。
四、快速安装
一、准备
1、禁用SELINUX,目的是为了让容器可以读取主机文件系统,重启生效
vim /etc/selinux/config 将 SELINUX=enforcing 改成 SELINUX=disabled
注:所有机器都要改动
2、关闭swap分区
kubernetes集群部署必须关闭swap分区,否则会报错,重启生效(为了搞这个,我的虚拟机搞崩两台)
vim /etc/fstab
注释掉带有swap的那一行
使用free -m查看是否已关闭,都是0表示已关闭
注:所有机器都要改动
3、添加网桥过滤
(1)添加网桥过滤及地址转发
vim /etc/sysctl.d/k8s.conf net.bridge.bridge-ng-call-ip6tables = 1 net.bridge.bridge-ng-call-iptables = 1 net.ipv4.ip_forword = 1
(2)使用下列命令加载br_netfilter模块
modprobe br_netfilter
(3)使用下列命令查看是否已加载
lsmod | grep br_netfilte
(4)使用下列命令加载网桥过滤文件
sysctl -p /etc/sysctl.d/k8s.conf
注:所有机器都要改动
4、开启IPVS
(1)安装ipset、ipvsadm
yum -y install ipset ipvsadm
(2)添加需要加载的模块
vim /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4
(3)运行上述脚本
sh /etc/sysconfig/modules/ipvs.modules
查看是否已加载:
lsmod | grep ip_vs
注:所有机器都要改动
5、安装docker
-->docker安装
安装之后,需要更改docker配置文件
vim /etc/docker/daemon.json #添加下面这行配置 { "exec-opts":["native.cgroupdriver=systemd"]}
注:所有机器都要改动
二、安装k8s集群
1、需安装组件
kubeadm:初始化集群、管理集群等
kubelet:用于接收api-server指令,对pod生命周期进行管理
kubectl:集群命令行管理工具
2、设置阿里云yum源
vim /etc/yum.repos.d/k8s.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
查看kubeadm最新版本
yum list | grep kubeadm
注:所有机器都要改动
3、安装组件
此处安装版本为1.16.0,按需改动版本
yum -y install kubeadm-1.16.0-0 kubelet-1.16.0-0 kubectl-1.16.0-0
注:所有机器都要安装
4、配置kubelet
vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
配置开机自启动:
systemctl enable kubelet
注:所有机器都要改动
5、查看需要下载的镜像
Master机器上需要的镜像可以用下列命令查看:
kubeadm config images list
可以使用如下脚本下载:
#!/bin/bash img_list=‘ gotok8s/kube-apiserver:v1.16.0 gotok8s/kube-controller-manager:v1.16.0 gotok8s/kube-scheduler:v1.16.0 gotok8s/kube-proxy:v1.16.0 gotok8s/pause:3.1 gotok8s/etcd:3.3.15-0 gotok8s/coredns:1.6.2 ‘ #拉取镜像 for img in ${img_list} do docker pull $img done #使用docker tag重新打标 for img in ${img_list} do docker tag $img k8s.gcr.io${img:7} done #删除不需要的镜像 for img in ${img_list} do docker rmi $img done
因为k8s.gcr.io仓库需要才能下载,所以使用gotok8s仓库,然后在进行重新打标
Worker节点上的需要如下镜像
k8s.gcr.io/kube-proxy:v1.16.0 k8s.gcr.io/pause:3.1
可以使用Docker镜像导入导出命令:
#导出 docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.16.0 #导入 docker load -i kube-proxy.tar
6、集群初始化
在master节点上使用如下命令,包括指定kubernetes版本以及当前主机ip
kubeadm init --kubernetes-version=v1.16.0 --apiserver-advertise-address=192.168.197.100
会进行集群初始化以及各种证书的创建操作等。
出现如下内容说明初始化成功,里面包含接下来需要的操作,包括配置文件拷贝以及节点加入集群。
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.197.100:6443 --token cmx34b.juizw6tp9ptlgg9i --discovery-token-ca-cert-hash sha256:77661093886eb76ffa7595e200a4ce2a5b20f02c164f4946956dff16d941a1e7
(1)根目录下创建".kube"文件夹
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)使用如下命令安装网络插件weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n‘)"
(3)将worker节点加入集群中
在workder节点上执行如下命令
kubeadm join 192.168.197.100:6443 --token cmx34b.juizw6tp9ptlgg9i --discovery-token-ca-cert-hash sha256:77661093886eb76ffa7595e200a4ce2a5b20f02c164f4946956dff16d941a1e7
7、验证集群是否可用
#获取集群节点 kubectl get nodes
#查看集群健康状况 kubectl cluster-info
还有一种安装方式:二进制文件安装k8s集群,比较麻烦,有空看一下怎么搞。
===============================
我是Liusy,一个喜欢健身的程序员。
欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货、最新面试宝典,一起成为Java大神。
来都来了,关注一波再溜呗。