Kubernetes(K8S)
Kubernetes是Google开源的容器集群管理系统,整个生态系统使用Go语言编写,是基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。Kubernetes更加轻松地自动伸缩应用,减少宕机时间,提高安全性。无需额外编写脚本,就能检查、重启及改变Docker容器的数量,可以基于资源使用情况自动扩展容器。K8s的使用场景是需要快速伸缩的大型应用程序,K8s可以充分利用计算和存储资源。
官方网站:K8S特点
可移植:支持公有云,私有云,混合云。
自动化:自动部署,自动重启,自动复制,自动伸缩扩展。
可扩展:模块化,插件化,可挂载,可组合。
K8S架构
主要功能
数据卷: Pod中容器之间共享数据,可以使用数据卷。
应用程序健康检查: 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
复制应用程序实例: 控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
弹性伸缩: 根据设定的指标(CPU利用率)自动缩放Pod副本数。
服务发现: 使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
负载均衡: 一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。
滚动更新: 更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
服务编排: 通过文件描述部署服务,使得应用程序部署变得更高效。
资源监控: Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
提供认证和授权: 支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略。
核心组件
master组件包括: kube-apiserver, kube-controller-manager, kube-scheduler;
Node组件包括: kubelet, kube-proxy, docker或rocket(rkt);
docker或rocket(rkt): 容器。
etcd: 负责节点间的服务发现和配置共享,保持集群状态,比如Pod、Service等对象信息。
kube-apiserver: 提供认证、授权、访问控制、API注册和发现等HTTPAPI接口服务。
kubectl: 命令行工具,发送给kube-apiserver,作为整个系统的操作入口。
kubelet: 管理pods和它们上面的容器,images镜像、Volume(CVI)和网络(CNI)管理。
kube-controller-manager: 维护集群的状态,比如故障检测、自动扩展、滚动更新等。
kube-scheduler: 资源调度,按照预定的调度策略将Pod调度到相应的机器上。
container runtime: 镜像管理以及Pod和容器的运行。
kube-proxy: 为Service提供cluster内部的服务发现和负载均衡。
常用插件(Add-ons):
kube-dns: 负责为整个集群提供DNS服务;
Ingress Controller: 为服务提供外网入口;
Heapster: 提供资源监控;
Dashboard: 提供GUI;
Federation: 提供跨可用区的集群;
Fluentd-elasticsearch: 提供集群日志采集、存储与查询;
相关概念
cluster 是计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
master 是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。为了实现高可用,可以运行多个master。
node 职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。
pod k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。
controller
k8s通常不会直接创建pod,而是通过controller来管理pod的。controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等。
deployment 是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。
replicaset 实现了pod的多副本管理。使用deployment时会自动创建replicaset。
daemonset 用于每个node最多只运行一个pod副本的场景。
statefuleset
能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。同时statefulset会保证副本按照固定的顺序启动、更新或者删除。
job 用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。
service 定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
namespace 将一个物理的cluster逻辑上划分成多个虚拟cluster,不同的namespace里的资源是完全隔离的。
安装部署K8S集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
准备环境
3台物理机或虚拟机(内存>=2GB,CPU>=2)
操作系统CentOS7.x-86_x64(禁止swap分区)
可以访问外网,需要拉取镜像;
k8s-master 192.168.31.61
k8s-node1 192.168.31.62
k8s-node2 192.168.31.63
安装配置(所有节点)
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/'/etc/selinux/config # 永久
setenforce 0# 临时
关闭swap:
swapoff -a # 临时
vim /etc/fstab # 永久
分别设置主机名:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
将桥接的IPv4流量传递到iptables的链:
cat >/etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables =1
net.bridge.bridge-nf-call-iptables =1
EOF
sysctl --system # 生效
时间同步:
yum install ntpdate -y
ntpdate time.windows.com
安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
配置镜像下载加速器:
cat >/etc/docker/daemon.json << EOF
{
registry-mirrors:[https://b9pmyelo.mirror.aliyuncs.com]
}
EOF
systemctl restart docker
添加阿里云YUM软件源
cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
部署Kubernetes Master
kubeadm init
--apiserver-advertise-address=192.168.31.61
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.18.0
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
拷贝kubectl使用的连接k8s认证文件到默认路径:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
加入Kubernetes Node
在192.168.31.62/63(Node)执行。
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
kubeadm join 192.168.31.61:6443--token esce21.q6hetwm8si29qxwn
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
默认token有效期为24小时,重新创建token:
kubeadm token create --print-join-command
部署容器网络
使用Flannel解决容器跨主机网络通信。
Flannel使用ETCD来存储Pod子网与Node IP之间的关系。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改国内镜像地址
sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.11.0-amd64#g" kube-flannel.yml
kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-system
部署官方Dashboard(UI)
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
登录Dashboard
进入管理界面