Kubernetes属于主从分布式架构,主要由Master Node和Worker Node组成,以及包括客户端命令行工具kubectl和其它附加项。
Kubernetes主要由以下几个核心组件组成:
API Server主要用来处理REST的操作,确保它们生效,并执行相关业务逻辑,以及更新etcd(或者其他存储)中的相关对象。API Server是所有REST命令的入口,它的相关结果状态将被保存在etcd(或其他存储)中。API Server的基本功能包括:
另外,API Server也作为集群的网关。默认情况,客户端通过API Server对集群进行访问,客户端需要通过认证,并使用API Server作为访问Node和Pod(以及service)的堡垒和代理/通道。
scheduler组件为容器自动选择运行的主机。依据请求资源的可用性,服务请求的质量等约束条件,scheduler监控未绑定的pod,并将其绑定至特定的node节点。Kubernetes也支持用户自己提供的调度器,Scheduler负责根据调度策略自动将Pod部署到合适Node中,调度策略分为预选策略和优选策略,Pod的整个调度过程分为两步:
Pod控制器,k8s通过控制器来管理Pod资源,控制器包括ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等,每种controller都有对应的功能(比如Deployment是最常见的无状态应用的控制器,它支持应用的扩缩容、滚动更新等操作,为容器化应用赋予了极具弹性的功能);
etcd是一个简单的、分布式的、一致的key-value存储,主要被用来共享配置和服务发现。etcd提供了一个CRUD操作的REST API,以及提供了作为注册的接口,以监控指定的Node。集群的所有状态都存储在etcd实例中,并具有监控的能力,因此当etcd中的信息发生变化时,就能够快速的通知集群中相关的组件。
Kubelet是Kubernetes中最主要的控制器,它是Pod和Node API的主要实现者,Kubelet负责驱动容器执行层。在Kubernetes中,应用容器彼此是隔离的,并且与运行其的主机也是隔离的,这是对应用进行独立解耦管理的关键点
在Kubernetes中,kube proxy负责为Pod创建代理服务;引到访问至服务;并实现服务到Pod的路由和转发,以及通过应用的负载均衡。
kubectl run mytest --image=nginx --port=80
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/mytest created
##kubectl run 部署应用
##mytest 命名
##--image docker镜像
##--port 应用对外服务端口
查看当前pod
kubectl get pod
NAME READY STATUS RESTARTS AGE
mytest-cd84df8db-g5t8f 1/1 Running 0 2m53s
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mytest-cd84df8db-g5t8f 1/1 Running 0 3m58s 10.244.1.7 node1
访问应用
curl 10.244.1.7
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
注:此时应用只能内部访问
外部访问应用
kubectl expose deployment mytest --type=NodePort --port=80
service/mytest exposed
##–type=NodePort:使用结点+端口方式访问服务
查看服务端口
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 3d22h
mytest NodePort 10.96.95.124 80:30392/TCP 2m3s
访问服务
默认情况下应用只会运行一个副本,可以通过 kubectl get deployments查看副本数。
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mytest 1/1 1 1 12m
将副本集增加到3个
kubectl scale deployment mytest --replicas=3
deployment.apps/mytest scaled
查看pod
kubectl get pod
NAME READY STATUS RESTARTS AGE
mytest-cd84df8db-4cqvk 1/1 Running 0 35s
mytest-cd84df8db-g5t8f 1/1 Running 0 13m
mytest-cd84df8db-pz9k9 1/1 Running 0 35s
将副本集缩减到2个
kubectl scale deployment mytest --replicas=2
查看pod
kubectl get pod
NAME READY STATUS RESTARTS AGE
mytest-cd84df8db-g5t8f 1/1 Running 0 22m
mytest-cd84df8db-pz9k9 1/1 Running 0 9m26s
将当前应用nginx更改成为httpd
kubectl set image deployments/mytest mytest=httpd
deployment.apps/mytest image updated
nginx的pod会逐个被删除再更新成为httpd
访问服务
curl http://192.168.1.10:30392/
再将更新完的httpd回滚到nginx
kubectl rollout undo deployment mytest
查看pod
kubectl get pods
NAME READY STATUS RESTARTS AGE
mytest-6fcc9dd56b-4pfl9 1/1 Running 0 2m39s
mytest-6fcc9dd56b-fdz95 1/1 Running 0 2m41s
mytest-cd84df8db-w5cmc 0/1 ContainerCreating 0 1s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mytest-6fcc9dd56b-4pfl9 1/1 Running 0 2m59s
mytest-6fcc9dd56b-fdz95 0/1 Terminating 0 3m1s
mytest-cd84df8db-w5cmc 1/1 Running 0 21s
mytest-cd84df8db-z2rtx 0/1 ContainerCreating 0 4s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mytest-cd84df8db-w5cmc 1/1 Running 0 58s
mytest-cd84df8db-z2rtx 1/1 Running 0 41s