Kubernetes节点是集群里运行工作负载的工作机器(物理的VM或者物理服务器等)。这些节点由Kubernetes master控制,并且通过持续监控来维护应用程序的预期状态。之前它们被称为minion。和master类似,集群里的每个Kubernetes节点运行两个进程:
- kubelet是节点和Kubernetes Master之间的通信接口。
- kube-proxy是网络路由,它将每个节点上通过Kubernetes API定义的服务暴露出去。它还能够执行简单的TCP和UDP的流转发。
投票应用
这里开始尝试在Kubernetes上实际运行一个应用程序。不过首先需要在本地安装并运行Kubernetes。
安装Kubernetes
现在,Kubernetes在Docker社区版17.12 里开箱即用。如果你没有安装社区版,可以在https://www.docker.com/community-edition下载。
安装MiniKube
在本地运行Kubernetes,需要安装MiniKube。它会创建一个本地的VM并且运行一个单节点集群。不要在这上面运行生产集群。它最好仅用来做开发和测试。
单节点集群
要运行一个单节点集群,我们仅仅需要运行minikube start命令。然后,一个VM,一个集群和Kubernetes就运行起来了。
$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
运行kubectl version来验证环境搭建成功,同时检查Kubernetes的版本。
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T20:00:41Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
投票应用
这是一个基于微服务架构的简单应用,包括5个简单的服务。
- Voting-App:应用前端,用Python编写,用户使用它来投票
- Redis:内存内数据库,作为实时存储使用
- Worker:.Net服务,从Redis里获得投票并存储到Postgres数据库里
- DB:PostgreSql数据库,用作数据库。
- Result-App:应用前端,用Node.js编写,展示投票结果。
Git clone并且cd到投票应用程序的代码库里。
“k8s-specifications”文件夹里包含该投票应用服务的Kubernetes yaml定义。每个服务有两个yaml文件:一个服务文件和一个部署文件。服务文件定义pod的逻辑组及其策略。下面是投票程序里结果服务的服务文件:
apiVersion: v1
kind: Service
metadata:
name: result
spec:
type: NodePort
ports:
- name: "result-service"
port: 5001
targetPort: 80
nodePort: 31001
selector:
app: result
部署文件用来定义应用程序的预期状态,比如任意时间点应该运行着的副本数量。如下是投票应用的结果部署文件。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: result
spec:
replicas: 1
template:
metadata:
labels:
app: result
spec:
containers:
- image: dockersamples/examplevotingapp_result:before
name: result
创建服务和部署对象:
$ kubectl create -f k8s-specifications/
deployment "db" created
service "db" created
deployment "redis" created
service "redis" created
deployment "result" created
service "result" created
deployment "vote" created
service "vote" created
deployment "worker" created
已经好了!你的应用已经被成功部署到这个单节点集群里,可以查看运行着的Pod和服务的列表。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
db-86b99d968f-s5pv7 1/1 Running 0 1m
redis-659469b86b-hrxqs 1/1 Running 0 1m
result-59f4f867b8-cthvc 1/1 Running 0 1m
vote-54f5f76b95-zgwrm 1/1 Running 0 1m
worker-56578c48f8-h7zvs 1/1 Running 0 1m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 10.109.241.59 <none> 5432/TCP 2m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23m
redis ClusterIP 10.102.242.148 <none> 6379/TCP 2m
result NodePort 10.106.7.255 <none> 5001:31001/TCP 2m
vote NodePort 10.103.28.96 <none> 5000:31000/TCP 2m
投票应用暴露在30001端口,结果应用暴露在31001端口。你可以使用localhost:port来访问应用。还可以使用IP访问,IP可以通过minikube ip命令得到。