1主流的容器集群管理系统
2Kubernetes是什么
• Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8s。
• Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效。
官方网站:http://www.kubernetes.io
官方文档:https://kubernetes.io/zh/docs/home/
3Kubernetes集群架构与组件
Master组件
kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESTfulAPI提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如Deployment、Service
kube-scheduler
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
Node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
第三方容器引擎
容器引擎,运行容器, 例如docker、containerd、podman
4生产环境部署K8s的2种方式
kubeadm
Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制
从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
下载地址:https://github.com/kubernetes/kubernetes/releases
5服务器硬件配置推荐
6使用kubeadm快速搭建K8s集群
1、安装Docker
2、创建一个 Master 节点kubeadm init
3、将一个 Node 节点加入到当前集群中kubeadm join <Master节点的IP和端口 >
4、部署容器网络(CNI)kubectl apply -f calico.yaml
5、部署Web UI(Dashboard)
Kubernetes移出默认Docker!
在Kubernetes平台中,为了解决与容器运行时(例如Docker)集成问题,在早期社区推出了CRI(Container Runtime Interface,容器运行时接口),以支持更多的容器运行时。
当我们使用Docker作为容器运行时之后,架构是这样的,如图所示:
Kubernetes 计划弃用就是kubelet中dockershim。即 Kubernetes
kubelet 实现中的组件之一,它能够与 Docker Engine 进行通信。
为什么这么做?
• K8s核心代码优化
• Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查
• Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患
如何应对?
可通过cri-dockerd继续使用Docker,并了解其他主流容器运行时。
除了docker之外,CRI还支持很多容器运行时,例如:
• containerd:containerd与Docker相兼容,相比Docker轻量很多,目前较为成熟
• cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman
7Containerd容器运行时
Containerd容器运行时部署步骤如下:
1、准备配置
cat > /etc/sysctl.d/99-kubernetes-cri.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -system
2、安装Containerd
cd /etc/yum.repos.d
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd.io
PS:课堂上使用Docker,建议做完Containerd实验后,还恢复到Docker。
3、修改配置文件
• 设置pause镜像地址为阿里云镜像仓库地址
• 配置镜像下载加速器
4、配置kubelet使用containerd
containerd config default > /etc/containerd/config.toml
vi /etc/containerd/config.toml
...
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS= "--container-runtime-
endpoint=unix:///run/containerd/containerd.sock --pod-infra-
container-
image=registry.aliyuncs.com/google_containers/pause:3.9"
systemctl restart kubelet
5、验证
kubectl get node -o wide
containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。
准备crictl连接containerd配置文件:
cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
EOF
Docker vs Containerd管理命令
kubeconfig配置文件
kubectl使用kubeconfig认证文件连接K8s集群,使用kubectl config指令生成kubeconfig文件。
8kubectl管理命令概要
官方文档参考地址:https://kubernetes.io/zh/docs/reference/kubectl/overview/
9牛刀小试,快速部署一个网站
使用Deployment控制器部署镜像:
kubectl create deployment web-demo --image=lizhenliang/web-demo:v1
kubectl get deployment,pods
使用Service将Pod暴露出去:
kubectl expose deployment java-web-demo --port=80 --type=NodePort --target-port=80
kubectl get service
访问应用:
http://NodeIP:Port # 端口随机生成,通过kubectl get service获取
10基本资源概念
Pod:K8s最小部署单元,一组容器的集合
Deployment:最常见的控制器,用于更高级别部署和管理Pod
Service:为一组Pod提供负载均衡,对外提供统一访问入口
Label :标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces :命名空间,将对象逻辑上隔离,也利于权限控制
命名空间(Namespace):Kubernetes将资源对象逻辑上隔离,从而形成多