
本文共 5824 字,大约阅读时间需要 19 分钟。
为了方便大家系统的学习 Kubernetes ,我整理了一份 ,涵盖了 Kubernetes 基础知识、安装步骤以及整个 Kubernetes 体系的相关内容,相信大家读过这个系列之后,能够对 Kubernetes 有个更深入的认识。
目标
- 了解Kubernetes Pod
- 了解Kubernetes Node
- 学习如何调试部署问题
- 了解如何通过Service暴露应用
Kubernetes Pods
在Kubernetes中创建一个Deployment 部署就会在Node上创建一个Pod,Pod是Kubernetes中对于一组容器以及与容器相关的资源的集合。Pod中的容器会共享IP和端口资源。
A Pod is a group of one or more application containers (such as Docker or rkt) and includes shared storage (volumes), IP address and information about how to run them.
Kubernetes Nodes
Pod总是运行在Node上,Node可以是物理机也可以是虚拟机。在之前的中,一个Node包含的组件有Kubelet、容器环境以及kube-proxy。结构如下图所示:
kubectl - Kubernetes的CLI管理工具
kubectl是kubernetes的命令行管理工具。这里主要介绍在获取信息方面的一些功能。kubectl运行的时候,默认会在default的命名空间下查找资源,如果我们需要在自己的命名空间下查找资源,需要指定--namespace=xxx
参数。
kubectl get
获取命名空间
$ kubectl get namespacesNAME STATUS AGEdefault Active 2mkube-public Active 2mkube-system Active 2m
获取Pods
$ kubectl get podsNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-5dbf48f7d4-4k8zz 1/1 Running 0 3m
获取Pods详细信息
$ kubectl describe podsName: kubernetes-bootcamp-5dbf48f7d4-4k8zzNamespace: defaultNode: host01/172.17.0.45Start Time: Tue, 17 Jul 2018 03:02:04 +0000Labels: pod-template-hash=1869049380 run=kubernetes-bootcamp
kubectl log
查看日志
$ kubectl logs $POD_NAMEKubernetes Bootcamp App Started At: 2018-07-17T03:02:05.794Z | Running On:kubernetes-bootcamp-5dbf48f7d4-4k8zzRunning On: kubernetes-bootcamp-5dbf48f7d4-4k8zz | Total Requests: 1 | App Uptime: 527.706 seconds | Log Time: 2018-07-17T03:10:53.500Z
kubectl exec
在Pod中执行命令
$ kubectl exec $POD_NAME envPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=kubernetes-bootcamp-5dbf48f7d4-4k8zzKUBERNETES_PORT=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_PORT_443_TCP_PORT=443KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_PORT_HTTPS=443NPM_CONFIG_LOGLEVEL=infoNODE_VERSION=6.3.1HOME=/root
启动容器中的bash
$ kubectl exec -ti $POD_NAME bashroot@kubernetes-bootcamp-5dbf48f7d4-4k8zz:/# cat server.js
Kubernetes Service
在K8S集群中,Pod有用独立的IP,也具有独立的生命周期。一旦某个Node节点发生故障,ReplicationController会将该节点上的Pod迁移到集群中其他Node节点上。对于有多个Pod,为前端应用提供相同的服务,这时前端其实不关心调用的后台具体哪个Pod,这时就要用到Service。
A Service in Kubernetes is an abstraction which defines a logical set of Pods and a policy by which to access them.
Kubernetes中的Service是集群中一组Pod以及访问策略的抽象。可以通过YAML、JSON定义,目标Pods通常通过LabelSelector定义。通过type
字段,服务定义了应用暴露的几种方式:
- ClusterIP,默认的方式,通过集群IP来对外提供服务,这种方式只能在集群内部访问。
- NodePort,利用NAT技术在Node的指定端口上提供对外服务。外部应用通过
: 的方式访问。 - LoadBalancer,利用外部的负载均衡设施进行服务的访问。
- ExternalName,这是1.7版本之后 kube-dns 提供的功能。
服务提供了在一组Pods之间分配流量的功能,同时也是因为服务这个抽象层的存在,Kubernetes才能够在不影响应用的情况下进行扩缩容。通常Service通过label和selector来确定可操作的对象。label可以在对象创建时指定,也可以在运行时修改。
查看服务状态
$ kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1443/TCP 44s
对外部暴露服务
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080service "kubernetes-bootcamp" exposed$ kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1443/TCP 2mkubernetes-bootcamp NodePort 10.99.175.225 8080:32172/TCP 5s
查看服务详细信息
$ kubectl describe service/kubernetes-bootcampName: kubernetes-bootcampNamespace: defaultLabels: run=kubernetes-bootcampAnnotations:Selector: run=kubernetes-bootcampType: NodePortIP: 10.99.175.225Port: 8080/TCPTargetPort: 8080/TCPNodePort: 32172/TCPEndpoints: 172.18.0.2:8080Session Affinity: NoneExternal Traffic Policy: ClusterEvents:
这个例子中Node没有外部IP,所以显示为空。利用内部IP测试。
$ curl 172.17.0.11:32172Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-hmc69 | v=1
通过标签查询Pod和Service
$ kubectl get pods -l run=kubernetes-bootcampNAME READY STATUS RESTARTS AGEkubernetes-bootcamp-5c69669756-hmc69 1/1 Running 0 8m$ kubectl get services -l = run=kubernetes-bootcamperror: name cannot be provided when a selector is specified$ kubectl get services -l run=kubernetes-bootcampNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes-bootcamp NodePort 10.99.175.2258080:32172/TCP 6m
新增标签
$ kubectl label pod $POD_NAME app=v1pod "kubernetes-bootcamp-5c69669756-hmc69" labeled$ kubectl describe pods $POD_NAMEName: kubernetes-bootcamp-5c69669756-hmc69Namespace: defaultNode: minikube/172.17.0.11Start Time: Tue, 17 Jul 2018 05:20:35 +0000Labels: app=v1 pod-template-hash=1725225312 run=kubernetes-bootcamp$ kubectl get pods -l app=v1NAME READY STATUS RESTARTS AGEkubernetes-bootcamp-5c69669756-hmc69 1/1 Running 0 11m
删除服务
$ kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1443/TCP 12mkubernetes-bootcamp NodePort 10.99.175.225 8080:32172/TCP 10m$ kubectl delete service -l run=kubernetes-bootcampservice "kubernetes-bootcamp" deleted$ kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 443/TCP 12m
参考资料:
发表评论
最新留言
关于作者
