¶一、概念
¶1. 定义
k8s是Google开源的一个容器集群管理系统。
k8s用于容器化应用程序部署、扩展和管理。
k8s提供了容器编排,资源调度,自动修复,弹性伸缩(自动根据服务器的并发情况扩增或者缩减容器数量),自动部署,回滚处理,服务发现,负载均衡等一些列功能。
k8s目标是让容器化应用简单高效。
官方中文文档:https://kubernetes.io/zh/docs/home
¶2. 核心对象
Kubernetes 对象
-
- 最小可部署单元(k8s不能直接启动容器,而是需要通过Pod间接启动容器)
- 一组容器(docker)集合
- 一个Pod中的所有容器共享网络命名空间
- Pod是短暂的,运行完就结束了
-
Service 服务
- 将一组Pod(比如mysql Pod)关联起来,提供统一的入口
- 防止pod失联,Pod地址发生改变,入口不受影响
-
Volume 数据卷
- 类似于Docker的Volume
-
Namespace 命名空间
- 用于隔离Pod的运行环境(默认情况Pod可以互相访问)
- 使用场景:
- ①为开发环境、测试环境、生产环境准备不同的命名空间
- ②为不同的用户提供不同的隔离的运行环境
-
Controller 控制器
Controller控制器基本对象构建并提供额外的功能和方便使用的特性,用于控制pod启动、停止、删除等。
¶3. 节点分类
-
master node:主控节点
-
worker node:工作节点
(1)master node相关的组件(程序)
apiserver:接收客户端操作k8s的指令,此外也是其他组件互调的桥梁。
schduler:从多个worker node的pod中选举一个来启动服务。
controller manager:管理控制器的组件,用于向work node的kubelet发送指令。
etcd:分布式键值对数据库。用于保存集群状态数据,比如pod、service等对象信息。
(2)worker node相关的组件(程序)
kubelet:向docker发送指令从而管理容器并汇报节点状态给apiserver。
kubeproxy:管理docker容器的网络。
¶二、部署单master集群
¶1. 集群规划
主机名 | ip | 组件 |
---|---|---|
k8s-master1 | 192.168.222.101 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
k8s-worker1 | 192.168.222.201 | kubelet、kube-proxy、docker、etcd |
k8s-worker2 | 192.168.222.202 | kubelet、kube-proxy、docker、etcd |
¶2. 系统环境
操作系统:centos7
k8s版本:1.16.2
docker版本:18.09.9-3
安装方式:离线二进制安装
¶3. 初始化服务器
(1)关闭防火墙
1 | systemctl stop firewalld |
(2)关闭selinux
1 | 临时生效 |
1 | 永久生效 |
(3)关闭交换分区
1 | 临时生效 |
1 | 永久生效 |
1 | 检测是否关闭成功 |
(4)配置主机名
1 | 对三台机器分别修改主机名 |
- k8s-master1
1 | hostnamectl set-hostname k8s-master1 |
- k8s-worker1
1 | hostnamectl set-hostname k8s-worker1 |
- k8s-worker2
1 | hostnamectl set-hostname k8s-worker2 |
验证是否修改成功
1 | hostname |
(5)配置名称解析
三台主机都做如下配置
1 | cat << EOF >> /etc/hosts |
然后互相ping查看是否都能通过主机名连接
1 | ping 主机名 |
(6)配置时间同步
选择一个节点作为时间上游服务端,其他的节点作为时间下游客户端。比如这里选择k8s-master1为服务端。那么需要做如下配置:
① k8s-master1
1 | yum install chrony -y |
1 | vim /etc/chrony.conf |
1 | 注释掉上游server相关的记录,并新加一条server记录 |
1 | 启动 |
1 | 查看启动情况 |
① k8s-worker1和k8s-worker2
1 | yum install chrony -y |
1 | vim /etc/chrony.conf |
1 | 指定上游服务器为k8s-master1的ip |
1 | 启动 |
1 | 查看时间是否与上游服务器同步 |
¶4. 部署etcd
为了节省服务器资源,这里把etcd分别部署到k8s-master1、k8s-worker1、k8s-worker2里。
¶4.1 生成证书
给etcd颁发证书,可以通过cfssl或者openssl工具生成自签证书。这里使用k8s推荐的cfssl。
(1)下载并安装cfssl
可以在k8s-master1上执行
1 | wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
(2)在/root/k8s
目录下编写三个json文件
1 | vim ca-config.json |
(3)生成证书命令
1 | 创建ca机构(得到ca私钥ca-key.pem和ca公钥ca.pem,用于给ca机构自身,申请者需要携带公钥来申请服务颁发证书) |
¶4.2 安装etcd
二进制包下载地址:https://github.com/coreos/etcd/releases/
有etcd的node上都要部署,注意文件夹的名字和位置,不是随便命名和放置的。
(1)在三台服务器上都执行如下命令进行安装
1 | 安装etcd |
(2)三台服务器上分别创建etcd配置文件
- k8s-master1
1 | touch /opt/etcd/cfg/etcd.conf && chmod 777 /opt/etcd/cfg/etcd.conf |
- k8s-worker1
1 | touch /opt/etcd/cfg/etcd.conf && chmod 777 /opt/etcd/cfg/etcd.conf |
- k8s-worker2
1 | touch /opt/etcd/cfg/etcd.conf && chmod 777 /opt/etcd/cfg/etcd.conf |
(3)三台服务器上分别创建systemd管理etcd的配置文件
1 | vim /usr/lib/systemd/system/etcd.service |
(4)在k8s-master1主机里将之前生成的证书分别拷贝到各个节点的/opt/etcd/ssl
目录里。
1 | cd ~/k8s/ |
(5)三台服务器上分别都启动etcd并设置开机启动
1 | systemctl start etcd |
(6)在都部署完成后,在任意节点执行如下命令检查一下集群的状态(若是出现cluster is healthy,说明部署成功!)
1 | /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.222.101:2379,https://192.168.222.201:2379,https://192.168.222.202:2379" cluster-health |
¶5. 部署master组件
需要部署的组件有:kube-apiserver、kube-controller-manager、kube-scheduler。
¶5.1 生成证书
在k8s-master1上执行命令:
1 | 初始化安装目录 |
1 | 创建ca机构并生成ca证书 |
1 | 生成apiserver证书 |
1 | 生成kube-proxy证书 |
最终得到ca-key.pem、ca.pem、kube-proxy-key.pem、kube-proxy.pem、server-key.pem、server.pem 6个以pem结尾的文件,则成功。
1 | cp ca*pem server*pem /opt/kubernetes/ssl |
¶5.2 下载并安装kubernetes
1 | cd ~/k8s |
¶5.3 部署kube-apiserver
(1)创建token文件
1 | vim /opt/kubernetes/cfg/token.csv |
第一列:随机字符串,自己可生成
第二列:用户名
第三列:UID
第四列:用户组
(2)创建组件的配置文件
1 | vim /opt/kubernetes/cfg/kube-apiserver.conf |
参数说明:
logtostderr 启用日志
v 日志等级
etcd-servers etcd集群地址
bind-address 监听地址
secure-port https安全端口
advertise-address 集群通告地址
allow-privileged 启用授权
service-cluster-ip-range Service虚拟IP地址段
enable-admission-plugins 准入控制模块
authorization-mode 认证授权,启用RBAC授权和节点自管理
enable-bootstrap-token-auth 启用TLS bootstrap功能,后面会讲到
token-auth-file token文件
service-node-port-range Service Node类型默认分配端口范围
(3)创建systemd管理组件的配置文件
1 | vim /usr/lib/systemd/system/kube-apiserver.service |
(4)启动
1 | systemctl daemon-reload |
¶5.4 部署kube-scheduler
(1)创建组件的配置文件
1 | vim /opt/kubernetes/cfg/kube-scheduler.conf |
参数说明:
master 连接本地apiserver
leader-elect 当该组件启动多个时,自动选举(HA)
address服务监听的地址
(2)systemd管理组件的配置文件
1 | vim /usr/lib/systemd/system/kube-scheduler.service |
(3)启动
1 | systemctl daemon-reload |
¶5.5 部署kube-controller-manager
(1)创建组件的配置文件
1 | vim /opt/kubernetes/cfg/kube-controller-manager.conf |
参数说明:
master 连接本地apiserver的ip地址
address kube-controller-manager监听的地址
allocate 是否支持CNI网络插件
cluster-cidr CNI网段
service-cluster-ip-range 给客户端分配的ip网络范围
leader-elect 当该组件启动多个时,自动选举(HA)
(2)systemd管理组件的配置文件
1 | vim /usr/lib/systemd/system/kube-controller-manager.service |
(3)启动
1 | systemctl daemon-reload |
¶5.6 查看集群组件状态
可以通过kubectl工具查看当前集群组件状态。
1 | cp /opt/kubernetes/bin/kubectl /bin/ |
¶5.7 启用tls基于bootstrap自动颁发证书
1 | kubectl create clusterrolebinding kubelet-bootstrap \ |
¶6. 部署worker组件
需要部署的组件有:docker、kubelet、kube-proxy。
¶6.1 安装docker
由于官方下载速度比较慢,所以需要更改 Docker 安装的 yum 源,这里推荐用阿里镜像源:
1 | $ yum install yum-utils -y |
显示 docker 所有可安装版本:
1 | $ yum list docker-ce --showduplicates | sort -r |
安装指定版本 docker
注意:安装前一定要提前查询将要安装的 Kubernetes 版本是否和 Docker 版本对应。
1 | $ yum install -y docker-ce-18.09.9-3.el7 |
启动并加入开机启动
1 | sudo systemctl start docker |
镜像下载加速
1 | vim /etc/docker/daemon.json |
添加以下内容:
1 | { |
可以配置多个加速镜像。由于镜像服务可能出现宕机,建议同时配置多个加速镜像。
1 | 重新加载配制 |
¶6.2 部署kubelet和kube-proxy组件
(1)安装kubelet和kube-proxy组件
1 | mkdir ~/k8s && cd ~/k8s |
(2)从master节点复制证书到k8s-worker1和k8s-worker2节点
1 | cd ~/k8s |
(2)在k8s-worker1和k8s-worker2都创建如下kube-proxy.kubeconfig文件
1 | vim /opt/kubernetes/cfg/kube-proxy.kubeconfig |
1 | apiVersion: v1 |
server 指定matser的ip
(3)在k8s-worker1和k8s-worker2都创建如下kube-proxy.kubeconfig文件,注意hostnameOverride要指定为当前主机的主机名。
1 | vim /opt/kubernetes/cfg/kube-proxy-config.yml |
1 | kind: KubeProxyConfiguration |
hostnameOverride 指定当前主机的主机名
(4)在k8s-worker1和k8s-worker2都创建如下kube-proxy.conf文件。
1 | vim /opt/kubernetes/cfg/kube-proxy.conf |
1 | KUBE_PROXY_OPTS="--logtostderr=false \ |
(5)在k8s-worker1和k8s-worker2都创建如下kubelet-config.yml文件。
1 | vim /opt/kubernetes/cfg/kubelet-config.yml |
1 | kind: KubeletConfiguration |
(6)在k8s-worker1和k8s-worker2都创建如下kubelet.conf文件,注意hostname-override要指定为当前主机的主机名。
1 | vim /opt/kubernetes/cfg/kubelet.conf |
1 | KUBELET_OPTS="--logtostderr=false \ |
hostname-override 指定当前主机的主机名
(7)在k8s-worker1和k8s-worker2都创建如下bootstrap.kubeconfig文件。
1 | vim /opt/kubernetes/cfg/bootstrap.kubeconfig |
1 | apiVersion: v1 |
server 指定matser的ip
(8)在k8s-worker1和k8s-worker2都配置如下系统启动服务配置文件。
1 | vim /usr/lib/systemd/system/kube-proxy.service |
1 | [Unit] |
1 | vim /usr/lib/systemd/system/kubelet.service |
1 | [Unit] |
(9)k8s-worker1和k8s-worker2都启动kubelet和kube-proxy服务
1 | systemctl start kube-proxy |
(10)在master节点为worker节点颁发证书
1 | 查看worker的证书请求 |
¶6.3 安装网络插件
(1)在所有worker节点上安装cni网络插件
1 | mkdir -pv /opt/cni/bin /etc/cni/net.d |
(2)在master上执行yaml脚本,实现在worker节点安装启动网络插件功能
1 | vi ~/k8s/kube-flannel.yaml |
1 |
|
下载flannel镜像并启动容器和完成网络连接
1 | kubectl apply -f ~/k8s/kube-flannel.yaml |
注意:这个操作受限于网络,可能会需要5~10分钟才能执行成功,如果网上太慢,会导致超时。
查看worker节点的状态
1 | 查看worker节点的状态(n指命名空间) |
(3)授权apiserver可以访问kubelet
1 | vi ~/k8s/apiserver-to-kubelet-rbac.yaml |
1 | apiVersion: rbac.authorization.k8s.io/v1 |
1 | kubectl apply -f ~/k8s/apiserver-to-kubelet-rbac.yaml |
¶7. 通过k8s启动nginx容器
在master节点上执行操作:
1 | 创建deployment,通过deployment来创建和管理nginx容器 |
¶8. 配置web界面
¶8.1 官方dashboard
在matser上执行下面操作安装dashboard
1 | vi ~/k8s/dashboard.yaml |
1 | # Copyright 2017 The Kubernetes Authors. |
1 | kubectl apply -f ~/k8s/dashboard.yaml |
¶8.2 第三方dashboard
在matser上执行下面操作。
1 | vi ~/k8s/start_kuboard.yaml |
1 | apiVersion: apps/v1 |
修改nodeName的值为worker节点的主机名称,这里写为k8s-worker1
1 | kubectl apply -f ~/k8s/start_kuboard.yaml |
访问http://192.168.222.201:32567后出现如下页面,需要输入token。
需要到master执行如下命令获取token。
1 | kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d |
输入token并登录之后得到如下页面。
¶9. CoreDNS
CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能。在k8s集群环境下,各个节点服务器的 IP 地址都可能会变动,那么就会需要频繁地修改配置,为了解决这个痛点,k8s利用了CoreDNS实现服务注册与发现。
在master节点如下操作:
1 | vi ~/k8s/coredns.yaml |
1 | # Warning: This is a file generated from the base underscore template file: coredns.yaml.base |
1 | kubectl apply -f ~/k8s/coredns.yaml |