Kubernetes(K8S)中文文档_Kubernetes中文社区
Kubernetes基础
在集群上规模化,带版本,部署和调试容器化应用
实现热更新
Kubernetes操作
创建集群
部署,发布,查看,更新应用‘
Minikube 部署 Kubernetes
创建Kubernetes cluster(单机版)最简单的方法是minikube:
使用 kubectl 创建Deployment
创建Deployment后,Kubernetes master 会将Deployment创建好的应用实例调度到集群中的各个节点。
Kubernetes Deployment Controller会持续监视这些实例
如果管理实例的节点被关闭或删除,那么 Deployment Controller将会替换它们,实现自我修复能力。
老的部署方式,一般通常安装脚本来启动应用,但是便不会在机器故障后“自动”恢复
集群的方式也是一个master,多个slave.master部署一个应用然后再分发到多个node上
创建Deployment时,需要为应用程序指定容器镜像以及要运行的副本数
kubectl version
kubectl get nodes
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
kubectl get deployments
运行一个代理
We will open a second terminal window to run the proxy.
echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; kubectl proxy
curl http://localhost:8001/version
API服务器将根据POD名称自动为每个POD创建一个端点,这个端点也可以通过代理访问。首先,我们需要获得POD名称,然后将变量POD_NAME存储在环境中:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Kubernetes 中查看Pods和Nodes
Kubernetes Pod
Deployment时,Kubernetes会创建了一个Pod来托管应用。
pod组成
Volumes 卷
唯一的集群IP地址
每个容器运行的信息,例如:容器镜像版本
Kubernetes Node上至少运行着
Kubelet
container runtime
一个service管理一组pod
Service的四种type:
ClusterIP(默认) - 在集群中内部IP上暴露服务。此类型使Service只能从群集中访问。
NodePort - 通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
LoadBalancer - 使用云提供商的负载均衡器(如果支持),可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
ExternalName - 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容,没有任何类型代理被创建。这种类型需要v1.7版本或更高版本kube-dnsc才支持。
Service 使用label selectors来匹配一组Pod
Label可以在创建时或以后附加到对象上,可以随时修改。
kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
kubectl describe services/kubernetes-bootcamp
kubectl describe deployment/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
curl ip:30092
kubernetes-bootcamp NodePort 10.108.100.97 <none> 8080:30092/TCP
伸缩应用
如果伸缩需求是0,将会终止Deployment指定的所有Pod
Service集成了负载均衡器,可以将网络流量分配到Deployment暴露的所有Pod中。Service将使用Endpoints持续监控运行的Pod,以确保仅将流量分配到可用的Pod。
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl get deployments
kubectl get pods -o wide
有4个不同的服务在不同的pod
kubectl describe services/kubernetes-bootcamp
Endpoints: 172.18.0.2:8080,172.18.0.5:8080,172.18.0.6:8080 + 1 more...
每一个pod在一个node上有不同的ip 一个node可以有两个相同的pod但是ip不同
应用更新
滚动更新通过Deployments实现应用实例在不中断、不停机情况下更新,新的Pod会逐步调度到可用的资源Node节点上。
将应用从一个环境升级到另一个环境(通过容器镜像更新)
回滚到之前的版本
持续集成和持续交付应用的零停机
更新image
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
回滚
kubectl rollout status deployments/kubernetes-bootcamp
使用Minikube集群
Kubernetes集群
Master节点:协调控制整个集群。
Nodes节点:运行应用的工作节点。
node process 每个node有一个进程
Minikube CLI提供集群管理的基本操作,包括 start、stop、status、 和delete。
minikube version
minikube start
kubectl cluster-info
构建应用
docker build -t hello-node:v1 .
kubectl run hello-node --image=hello-node:v1 --port=8080
kubectl get deployments
minikube service hello-node
Kubernetes集群设计文档
Kubernetes 架构
Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。
Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。
Borg简介
Borg是谷歌内部的大规模集群管理系统
Kubernetes核心组件:
概念
通过Kubernetes你可以
快速部署应用
快速扩展应用
无缝对接新的应用功能
节省资源,优化硬件资源的使用
Google 10多年大规模容器管理技术Borg的开源版
组件
Master
kube-apiserver
etcd是Kubernetes提供默认的存储系统,保存所有集群数据,使用时需要为etcd数据提供备份计划。
节点(Node)
kube-proxy
kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。
supervisord
supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行。
Kubernetes对象
Object的配置:Object Spec和Object Status
Spec描述了对象所需的状态 Status描述了对象的实际状态,并由Kubernetes系统提供和更新。
Kubernetes Names
Kubernetes REST API中的所有对象都用Name和UID来明确地标识。
/api/v1/pods/some-name
Kubernetes Namespaces
Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。
相同Namespace中的对象将具有相同的访问控制策略。
Kubernetes Volume
默认情况下容器中的磁盘文件是非持久化的
容器之间需要共享文件
对于Docker 1.7,每个容器只允许挂载一个Volume,并且不能将参数传递给Volume
Kubernetes Volume具有明确的生命周期 - 与pod相同。
Kubernetes支持许多类型的Volume,Pod可以同时使用任意类型/数量的Volume。
一个Volume只是一个目录,目录中可能有一些数据,pod的容器可以访问这些数据。
要使用Volume,pod需要指定Volume的类型和内容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。
Volume 类型
hostPath
hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
还有一些基于不同运行环境的磁盘
secret
secret volume用于将敏感信息(如密码)传递给pod。可以将secrets存储在Kubernetes API中,使用的时候以文件的形式挂载到pod中
Kubernetes Annotations
绑定用户信息
Node
conditions字段描述所有Running节点的状态。
OutOfDisk True:如果节点上没有足够的可用空间来添加新的pod;否则为:False
Ready True:如果节点是健康的并准备好接收pod;False:如果节点不健康并且不接受pod;Unknown:如果节点控制器在过去40秒内没有收到node的状态报告。
MemoryPressure True:如果节点存储器上内存过低; 否则为:False。
DiskPressure True:如果磁盘容量存在压力 - 也就是说磁盘容量低;否则为:False。
master和Kubernetes集群之间通信路径。
其目的是允许用户自定义安装,以增强网络配置,使集群可以在不受信任(untrusted)的网络上运行。
第一个是从apiserver到在集群中的每个节点上运行的kubelet进程。第二个是通过apiserver的代理功能从apiserver到任何node、pod或service 。
从apiserver到Node、Pod或Service的连接默认为HTTP连接,因此不需进行认证加密。也可以通过HTTPS的安全连接
pods
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。
Kubernetes Replica Sets
ReplicaSet能确保运行指定数量的pod。
这意味着你可能永远不需要操作ReplicaSet对象,而是使用Deployment替代管理 。
Kubernetes Deployment
Kubernetes 垃圾收集
级联删除
Kubernetes kubectl 概述
涵盖了kubectl语法,对命令操作的描述,并列举的常见例子。
官方文档
https://www.kubernetes.org.cn/doc-45
kubectl [command] [TYPE] [NAME] [flags]
create,get,describe,set,delete
node pod service