K8S 的核心功能:自动化运维管理多个容器化程序;
核心架构角色:
kube-apiserver
负责公开了 Kubernetes API,负责处理接受请求的工作;
etcd
分布式数据库;一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库。需要保证高可用、避免单点故障;
kube-scheduler
kube-controller-manager
kubelet
kube-proxy
Container Runtime
当我们执行创建Ngnix的容器时、执行以下K8S命令
kubectl create deployment nginx --image=nginx
命令的执行流程如下:
语法:
kubectl [command] [TYPE] [NAME] [flags]
你需要帮助,在终端窗口中运行 kubectl help
创建一个Tomcat应用程序
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine
查询部署信息
kubectl get deployment
kubectl get pod -o wide
kubectl get pod my-tomcat -o wide
查看容器日志
kubectl logs my-tomcat-685b8fd9c9-rw42d(pod名称)
使用 exec 可以在Pod的容器中执行命令,这里使用 env 命令查看环境变量
kubectl exec my-tomcat-685b8fd9c9-rw42d – env
kubectl exec my-tomcat-685b8fd9c9-rw42d – ls / # 查看容器的根目录下面内容
进入Pod容器内部并执行bash命令,如果想退出容器可以使用exit命令
kubectl exec -it my-tomcat-685b8fd9c9-rw42d – sh
访问一下这个tomcat pod
集群内访问(在集群里任一worker节点都可以访问)
curl 10.244.36.69:8080
K8S中、将服务暴露到外网访问、需要使用service;
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort
查看service
kubectl get svc -o wide
svc 是 service简写
K8S的service服务端口号为8080, 宿主机映射的随机端口为32224, 因此可通过 集群工作节点IP : 随机端口 访问
service服务有个特点,如果端口暴露类型为NodePort,那么可以通过集群内所有worker主机加暴露的端口进行访问
删除Pod:
#查看pod信息,-w意思是一直等待观察pod信息的变动
kubectl get pod -w
kubectl delete pod my-tomcat-685b8fd9c9-rw42d
这意味着、每次执行del都会重新创建运行Pod, 相当于是Pod重启命令、 也是 K8S的核心特性、服务自愈;
kubectl get pod,svc
服务扩缩容
kubectl scale --replicas=5 deployment my-tomcat
kubectl scale --replicas=3 deployment my-tomcat
滚动升级与回滚
对my-tomcat这个deployment进行滚动升级和回滚,将tomcat版本由tomcat:7.0.75-alpine升级到tomcat:8.0.41-jre8-alpine,再回滚到tomcat:7.0.75-alpine
kubectl set image deployement my-tomcat tomcat= tomcat:8.0.41-jre8-alpine
kubectl describe pod my-tomcat-547db86547-4btmd
kubectl rollout history deploy my-tomcat
kubectl rollout undo deployment my-tomcat #–to-revision 参数可以指定回退的版本
标签的使用
通过给资源添加Label,可以方便地管理资源(如Deployment、Pod、Service等)。
kubectl subscribe deployment my-tomcat
kubectl get pod -l app=my-tomcat
kubectl get service -l app=my-tomcat
kubectl label pod my-tomcat-685b8fd9c9-lrwst version = v1
kubectl describe pods my-tomcat-685b8fd9c9-lrwst
kubectl get pod -l version=v1
kubectl delete service -l version=v1
命令总结:
kubectl create deployment #创建一个deployment来管理创建的容器
kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe #显示特定资源或资源组的详细信息
kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set #更改现有的应用程序资源
kubectl rollout #资源回滚管理
kubectl delete #删除资源
负责创建和更新应用程序的实力、 应用程序可以理解为Pod;
创建Deployment后,Master Node将应用程序实例调度到各个工作节点上运行;
如果工作节点上的应用程序关闭停止、则Master Node会将应用程序实例调度到其他的工作节点上、也是服务自愈;
相当于逻辑主机、 托管应用程序实例; 内部包含一个或者多个程序容器(Docker层);
可以理解为 在Docker容器层之上、再封装了一层的容器;
为Pod提供外部访问暴露、负载均衡、服务发现;即Pod的网络代理;
若Pod没有设置Service、则只能在集群内部访问、集群外部无法访问;
在ServiceSpec标记type的方式暴露,type类型如下:
工作负载型资源(workload): Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet等等
服务发现及负载均衡型资源(ServiceDiscovery LoadBalance): Service,Ingress等等
配置与存储型资源: Volume(存储卷),CSI(容器存储接口,可以扩展各种各样的第三方存储卷)
特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型),Secret(保存敏感数据),DownwardAPI(把外部环境中的信息输出给容器)
集群级资源:Namespace,Node,Role,ClusterRole,RoleBinding(角色绑定),ClusterRoleBinding(集群角色绑定)
元数据型资源:HPA(Pod水平扩展),PodTemplate(Pod模板,用于让控制器创建Pod时使用的模板),LimitRange(用来定义硬件资源限制的)
就业务开发来看、涉及频率高的是Pod、Deployment、 Ingress、Service, Volume、其他比较少涉及实用;
在k8s中,我们一般都会使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们一般称为资源清单
apiVersion: group/apiversion # 如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类别
metadata: #资源元数据
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段由kubernetes自身维护,用户不能去定义
#配置清单主要有五个一级字段,其中status字段用户不能定义,由k8s自身维护
用创建deployment的命令加上参数 --dry-run -o yaml 输出部署的资源清单yaml
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine --dry-run -o yaml
使用yaml部署tomcat
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
name: my-tomcat-yaml #修改deployment的名称
spec:
replicas: 2 #修改pod副本为两个
selector:
matchLabels:
app: my-tomcat-yaml
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
spec:
containers:
- image: tomcat:7.0.75-alpine #容器的镜像(核心)
name: tomcat
resources: {}
status: {}
使用apply命令
kubectl apply -f deployment-demo.yaml
同样使用dry-run yaml获取yaml
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort --dry-run -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-tomcat-yaml
name: tomcat-service-yaml #修改service名称
spec:
ports:
- port: 80 # service的虚拟ip对应的端口,在集群内网机器可以访问用service的虚拟ip加该端口号访问服务
nodePort: 30001 # service在宿主机上映射的外网访问端口,端口范围必须在30000-32767之间
protocol: TCP
targetPort: 8080 # pod暴露的端口,一般与pod内部容器暴露的端口一致
selector:
app: my-tomcat-yaml #应用名称
type: NodePort
status:
loadBalancer: {}
执行apply命令创建service资源
kubectl apply -f service-demo.yaml
业务开发中、服务已经在运行了,我们需要查看yaml、就无需使用创建方式来查看了;
可以根据已运行的资源查看其yaml内容;
kubectl get pod nginx-deploy-7db697dfbd-2qh7v -o yaml
Ingress类型Nginx, 可以基于域名访问、实现访问的负载均衡;
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: tomcat.com #转发域名
http:
paths:
- path: /
backend:
serviceName: tomcat-service-yaml
servicePort: 80 #service的端口
kubectl apply -f ingress-tomcat.yaml
kubectl get ing #ingress 缩写 ing
192.168.65.203 (服务器IP) tomcat.com
或者
192.168.65.210 (服务器IP) tomcat.com
通过存储卷,我们可以把外部数据挂载到容器中去,供容器中的应用访问,这样就算容器崩溃了,数据也不会丢失;
docker的挂载:
docker run -p 80:80 --name nginx
-v /mydata/nginx/html:/usr/share/nginx/html
-v /mydata/nginx/logs:/var/log/nginx
-v /mydata/nginx/conf:/etc/nginx
-d nginx:1.10
K8S也可以挂载文件,添加配置文件nginx-volume-deployment.yaml用于创建Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-volume-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: html-volume
- mountPath: /var/log/nginx
name: logs-volume
- mountPath: /etc/nginx
name: conf-volume
volumes:
- name: html-volume
hostPath:
path: /home/docker/mydata/nginx/html
type: Directory
- name: logs-volume
hostPath:
path: /home/docker/mydata/nginx/logs
type: Directory
- name: conf-volume
hostPath:
path: /home/docker/mydata/nginx/conf
type: Directory
若是服务部署失败、则可通过subscribe查看问题
kubectl describe ${RESOURCE} ${NAME}
拉到最后看到Events部分,会显示出 K8S 在部署这个服务过程的关键日志。
若是服务部署成功、业务运行出现异常、则通过logs查看问题;
kubectl logs ${POD_NAME}
进入容器内部;
kubectl exec -it [options] ${POD_NAME} -c ${CONTAINER_NAME} [args]
kubectl exec -ti $POD_NAME – bash