本文已参与「新人创作礼」活动,一起开启掘金创作之路。
特性
- 自动装箱:基于容器对应用环境的资源配置要求自动部署应用容器
- 自动修复:
- 容器失败时自动重启
- 节点出问题时,重新调度、部署
- 容器未通过检查时,关闭容器
- 容器正常运行,才对外提供服务
- 水平扩展:对应用容器进行规模扩大、裁剪
- 服务发现:包含服务发现和负载均衡
- 滚动更新:根据应用的变化、对应用进行一次性或批量式更新
- 版本回退:根据应用部署情况,对应用进行历史版本即时回退
- 密钥和配置管理:不需要重新构建镜像,更新密钥和应用配置。
- 存储编排:
- 自动实现存储系统挂载及应用
- 存储卷动态供给
组件
- master
- apiserver:负责接收并处理请求。各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储
- scheduler:调度容器创建的请求
- controller-manager:检测控制器健康、确保容器健康
- etcd:分布式键值存储,用于保存集群状态数据,比如pod、service等
- node
- kubelet:用于与master通信,接收master调度过来的任务并执行。管理本机容器的生命周期。将每个pod转换成一组容器。
- kube-proxy:在Node节点上实现Pod网络代理。
- docker:容器引擎,用于创建、运行容器
部署
部署方式
- 传统方式部署k8s自身,k8s自己的相关组件统统运行为系统级的守护进程,包括master和node上的组件。缺点:每一步都需要手动解决,包括做证书等……过程繁琐且复杂;系统级的守护进程某个组件挂了需要手动启动。
- kubeadm
- 把k8s自己部署为pod
- master和node只需有手动安装kubelet和docker
- master和node中的组件运行为pod(static pod)
- flannel运行为pod,托管在k8s集群中
使用 kubeadm 部署 Kubernetes
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >
学习目标
- 在所有节点上安装Docker和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署 Kubernetes Node,将节点加入Kubernetes集群中
- 部署Dashboard Web页面,可视化查看Kubernetes资源
前提
- 各节点时间同步
- 各节点主机名称解析
hostname master hostnamectl set-hostname master echo "127.0.0.1 $(hostname)" >> /etc/hosts - 各节点iptables及firewalld服务器被disabled
systemctl stop firewalld systemctl disable firewalld - 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 - 关闭swap
swapoff -a # 临时 vim /etc/fstab # 永久 #注释掉swap行
步骤
- 设置各节点安装程序包
-
下载docker仓库文件
cd /etc/yum.repos.d/ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
生存Kubernetes仓库文件
vim kubernetes.repo[kubernetes] name=Kubernetes Repo 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/rpm-package-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg -
安装 (指定版本)
yum install -y docker-ce-19.03.8 kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8node节点可不安装kubectl
-
- 初始化主节点
- 设置ip6tables和iptables值为1
如果提示echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tablesNo such file or directory#安装bridge-util软件,加载bridge模块,加载br_netfilter模块 yum install -y bridge-utils modprobe bridge modprobe br_netfilter - 设置kubelet、docker开机自启动
systemctl enable kubelet docker - 启动docker、kubelet
systemctl start docker kubelet - 使用
kubeadm init初始化
记录生成的kubeadm init \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version=v1.18.8 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16kubeadm join完整命令 若失败,需重新初始化,则重置kubeadmkubeadm reset - 初始化kubectl
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config - 部署flannel
如果下载失败:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml- 从其他服务器下载镜像,修改tag,再打包
docker pull lizhenliang/flannel:v0.11.0-amd64 docker images docker tag lizhenliang/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64 docker image save quay.io/coreos/flannel:v0.11.0-amd64 -o flannelv0.11.0-amd64.tar - 导入镜像到服务器上,(master和nodes服务器都要)
docker load -i flannelv0.11.0-amd64.tar - 再执行该命令
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml如果之前安装过,没有成功,则先删除kubectl delete -f kube-flannel.yml查看flannel是否成功启动kubectl get pods -n kube-system
- 从其他服务器下载镜像,修改tag,再打包
- 验证master节点
kubectl get nodes
- 设置ip6tables和iptables值为1
- 添加node节点到集群中
- 同上操作:
- 启动docker
- 设置docker、kubelet开机自启
- 设置ip6tables、iptables值为1
- 导入镜像
- 将节点加入master集群中
使用前面记录的
kubeadm join命令 - 回到master节点验证
kubectl get nodes
- 同上操作: