Kubernetes 集群部署
概述
- 什么是Kubernetes
- 是一个可移植、可扩展的开源容器编排系统
- 由于Kubernetes在K和s间有8个字母,因此常简称为 K8S
Kubernetes的概念及用途
- 是一个开源的Docker容器编排系统
- 2015年7月v1.0正式发布,目前为止最新稳定版本v1.18
- 调度计算集群节点,动态管理节点上的作业
- 使用【labels】和【pods】概念,将应用按逻辑单元分组
- 主要用途
- 资源调度
- 部署管理
- 服务发现
- 扩容缩容
- 监控
- 自动化部署、扩展和管理容器应用
使用Kubernetes的好处
- 具备微服务架构
- 单体服务拆分成很多小的互相连接的微服务
- 实例副本数量根据负载进行调整
- 每个微服务的开发者可以自由选择开发技术
- 使得系统具备很高的稳定性和快速迭代进化能力
- 具备超强的横向扩容能力
- 横向扩容能力是互联网业务系统的关键指标
- 支持在线完成集群扩容
Kubernetes组件
- Master组件
- Kube-apiserver(对集群增删改查的接口)
- Etcd(集群数据库,k8s的默认存储数据库)
- Kube-scheduler(负责调度各个节点上的服务,资源调度)
- Kube-controller-manager(控制管理器)
(1)节点控制器(Node Controller):负责在节点出现故障时发现和响应
(2)复制控制器(Replication Controller):负责为系统中的每个复制控制器对象维护正确数量的
(3)端点控制器(Endpoints Controller):填充端点对象
(4)服务账户和令牌控制器(Server Account & Token Controllers):为新的命名空间创建默认帐户和 API 访问令牌
- Node组件
- Kubelet(负责Pod对应容器的创建、启停等任务,和master节点进行通信)
- Kube-proxy
- Docker Engine(容器引擎)
拓展:Pod(一组容器的集合)
Kubernetes资源对象
- 可通过Kubectl工具进行增删改查等操作
- 持久化存储到Etcd中
- 长用的资源对象
(1)Pod(一组容器的集合)
(2)Label(资源标签)
(3)Replication Controller(复制控制器)
(4)Deployment(负责管控Pod的数量)
(5)Service(客户端需要访问的服务)
(6)Job计划任务(计划任务)
(7)DaemonSet(守护程序集)
Kubernetes系统框架和计算模型
Kuberadm部署工具
- 是谷歌推出的专门用于快速部署Kubernetes集群的工具
- 关注的重点是快速安装并将集群运行起来
- 应用方向
(1)新用户可以使用Kubeadm快速搭建Kubernetes并了解
(2)老用户可以使用Kubeadm快速搭建集群并测试他们的应用
(3)在大型的项目可以将Kubeadm结合其他安装工具一起使用,形成一个比较复杂的系统
Kubernetes集群部署
- 机器配置
- 准备三台机器
- 配置最低2C4G
- 关闭内核安全机制,关闭防火墙
一、基本配置
- 修改主机名
第一台 master
第二台 node1
第三台 node2
- 所有机器写hosts映射
vi /etc/hosts
192.168.93.128 master
192.168.93.129 node01
192.168.93.130 node02
- 所有机器关闭交换分区
free -h # 可查看swap分区
swapoff -a # 临时关闭)
或者在/etc/fstab配置文件中注释掉swap这一行
- 所有机器部署Docker(部署18版本的)
yum -y install wget
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-18.09.9-3.el7
systemctl start docker
systemctl enable docker
- 所有节点修改内核配置(手动输入,复制的话最后一步可能导致无法运行)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生成配置
- 配置加速地址,并设置驱动
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ze43vnb.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload # 重载服务
systemctl restart docker # 重启服务
二、使用Kubeadm快速部署Kubernetes集群
vi /etc/yum.repos.d/kubernetes.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
yum repolist # 列出所有源,有kubernetes就行
或者
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
yum repolist # 列出所有源,有kubernetes就行
- 所有节点安装 Kubelet、Kubeadm 和 Kubectl,并设置开机自启动
yum install -y kubelet-1.16.0 kubeadm-1.16.0 kubectl-1.16.0
systemctl enable kubelet
- 第一台机器生成初始化配置文件
kubeadm init \
--apiserver-advertise-address=192.168.93.128 \ # 当前节点的IP,此处是主节点Master的IP
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
PS:如果初始化失败了以后解决方法:
输入kubeadm reset然后y
最后一行有个文件rm -rf 删除这个文件即可
- 执行完毕后复制最后三行内容去两台从节点node上执行
kubeadm join 192.168.93.128:6443 --token esjcdl.jfsul428oc5krk2s \
--discovery-token-ca-cert-hash sha256:b9e79e22e1bd9ccdbe4ed17bc3ce429c5abb8ffe8f09c9bfa86b3058909a6265
- 两台从节点执行完毕后显示的mkdir -p到sudo三行命令在master上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- master节点查看
kubectl get node (能执行成功即可)
- 上传yml文件至master节点部署网络
这里使用的是flannel的网络插件,已在网上下好
kube-flannel.yaml # 需上传的文件
kubectl apply -f kube-flannel.yaml # 部署网络,最后回显create即可
- 查看节点所有状态是ready即可(需稍等一会)
kubectl get node # status中master是ready即可
拓展:
kubectl get node -o wide # 查看
kubectl get cs # 查看集群状态
ubectl get ns # 查看命名空间
kubectl get pod -A # 查看所有的命名空间(状态是running即可)