Kubernetes简介
- 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应 用了很多年,Borg系统运行管理着成千上万的容器应用
- Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了 Borg系统中的经验和教训。
- Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将 最终的应用服务交给用户。
Kubernetes的好处:
- 隐藏资源管理和错误处理,用户仅需要关注应用的开发。
- 服务高可用、高可靠。
- 可将负载运行在由成千上万的机器联合而成的集群中。
Kubernetes架构设计
Kubernetes主要由以下几个核心组件组成:
- etcd:保存了整个集群的状态
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现 等机制
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
- kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
- kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
除了核心组件,还有一些推荐的Add-ons:
- kube-dns:负责为整个集群提供DNS服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控 • Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储与查询
• 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件 式应用执行环境
• 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服 务发现、DNS解析等)
• 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动 态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
• 接口层:kubectl命令行工具、客户端SDK以及集群联邦
• 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
- Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS 应用、ChatOps等
- Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的 配置和管理等
Kubernetes集群部署
配置官方文档:https://kubernetes.io/docs/setup/production-environment/container-runtimes/
首先先部署好一台harbor主机,这里我们使用已经部署好的harbor主机;下来使用三台主机做集群;
每台主机先安装docker-ce服务,并启动;然后再每台主机执行
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
然后重新加载,并重启docker
# systemctl daemon-reload
# systemctl restart docker
# swapoff -a 禁用swap分区
注释掉swap分区中的定义
安装k8s
为了快速部署使用阿里云地址去安装部署
(https://developer.aliyun.com/mirror/kubernetesspm=a2c6h.13651102.0.0.3e221b118CxWWY)
cat <<EOF > /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
EOF
安装:(为实验方便要关闭selinux和防火墙)
# yum install -y kubelet kubeadm kubectl
# systemctl enable --now kubelet 开机自启
# kubeadm config print init-defaults 查看默认配置信息(默认从k8s.gcr.io上下载组件镜像,需要翻墙才可以,所以需要修改镜像仓库)
# kubeadm config images list 查看需要哪些镜像
# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers 查看需要哪些镜像
# kubeadm config images pull --kubernetes-version=v1.18.3 --image-repository registry.aliyuncs.com/google_containers (由于我安装的是v1.18.5,阿里云没跟新,所以这里选定下以前的版本v1.183)
需要加参数,获取其他版本
这里我们将镜像获取下来, 上传到harbor主机。这样方便我们另外两台主机获取(这里我们使用脚本批量修改,上传)
# docker images 查看镜像
# docker images | grep registry.aliyuncs.com/google_containers | awk '{print "docker tag ",$1":"$2,$1":"$2}'| sed -e 's#registry.aliyuncs.com/google_containers#reg.westos.org/library#2' | sh -x 批量更改标签
# docker images | grep registry.aliyuncs.com/google_containers | awk '{print "docker rmi ",$1":"$2}' | sh -x 批量删除镜像
# docker images 查看镜像
没有操作前
执行脚本后
批量上传(注意上传时需要将ca.crt证书复制过来,并使用用户登录)
# docker images | grep reg.westos.org | awk '{print "docker push ",$1":"$2}' | sh -x 上传至harbor仓库
上传完成在harbor仓库查看
然后进行初始化,这里初始化镜像使用自己私有仓库的;--kubernetes-version可以选定版本
# kubeadm init --kubernetes-version=v1.18.3 --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/library 初始化集群
初始化完成后
创建kubeadm用户然后去提升权限
# useradd kubeadm
# visudo
# echo "source <(kubectl completion bash)" >> ~/.bashrc 配置k8s补齐功能
做完权限提升后切换到kubeadm用户
[kubeadm@server5 ~]$ mkdir -p $HOME/.kube
[kubeadm@server5 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[kubeadm@server5 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[kubeadm@server5 ~]$ kubectl get node 查看
将其他两台主机加入集群
# kubeadm token list 列出token(这里token是有有效期的,一般是24h)
# kubeadm join 192.168.1.35:6443 --token 6qsdv3.potvaaq82jy0n5xd --discovery-token-ca-cert-hash sha256:779a8abdb2580775f69fc3b5354e6ee65a82602d0ff2f92dfbcf8411ae9929b2 将两节点加入
下来安装flannel网络组件:由于访问得是外网,所以我们可以添加下解析
[kubeadm@server5 ~]$ sudo vim /etc/hosts
在每台节点上都执行此命令
[kubeadm@server5 ~]$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后Master查看状态:
# kubectl get cs
# kubectl get node
# kubectl get pod -n kube-system
添加节点:
master初始化成功后注意将kubeadm join xxx保存下来,等下node节点需要使用。如果忘记了,可以在master上通过kubeadm token list得到。
默认token 24小时就会过期,后续的机器要加入集群需要使用以下命令重新生成token
# kubeadm token create
获取ca证书sha256编码hash值
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
加一个曾经添加过的节点,先执行:
kubeadm reset 清空配置
再进行添加
kubeadm join 192.168.137.76:6443 --token <r6rahn.pgozs6koirmuni2q> --discovery-token-ca-cert-hash sha256:<ba91634e22716ddb85afeab415435db96428c8daa19cb870a69a542f7b31a013>
删除节点:
(1)卸载节点(drain 翻译排出,此时卸载节点,但是没有删除)
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
(2)删除节点
kubectl delete node <node name>
(3)清空init配置,需要删除的节点上执行
kubeadm reset