Pod是节点上的最小的部署单元。它是一组必须一起运行的容器。一般来说,但不是必须的,Pod通常包含一个容器。
Service用来定义一组逻辑上存在关系的Pod以及访问它们的相关策略。
Volume是Pod里所有容器都能访问的目录。
Namespace是由物理集群支撑的虚拟集群。
ReplicaSet确保在给定时间运行着特定数量的Pod副本
Deployment用来将当前状态变更到预期状态
StatefulSet用来控制部署顺序以及卷的访问等等。
DaemonSet用来在集群的所有节点或者特定节点运行Pod的拷贝。
Job用来执行一些任务并且在成功完成工作之后或者在给定时间之后退出。
kube-apiserver:整个集群的单点管理点。API server实现了RESTful的接口,用于和工具以及库函数的通信。kubectl命令直接和API server交互。
kube-controller-manager:通过管理不同类型的控制器来规范集群的状态。
kube-scheduler:在集群里的可用节点上调度工作负载。
kubelet是节点和Kubernetes Master之间的通信接口。
kube-proxy是网络路由,它将每个节点上通过Kubernetes API定义的服务暴露出去。它还能够执行简单的TCP和UDP的流转发。
$ 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"}
Voting-App:应用前端,用Python编写,用户使用它来投票
Redis:内存内数据库,作为实时存储使用
Worker:.Net服务,从Redis里获得投票并存储到Postgres数据库里
DB:PostgreSql数据库,用作数据库。
Result-App:应用前端,用Node.js编写,展示投票结果。
Git clone并且cd到投票应用程序的代码库里。
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命令得到。
# 启动Minikube服务器
$ minikube start
# 得到Minikube IP
$ minikube ip
版本信息:
$ kubectl version #得到kubectl版本
$ kubectl cluster-info #得到集群信息
创建对象:
$ kubectl create -f ./file.yml
$ kubectl create -f ./file1.yml -f ./file2.yaml
$ kubectl create -f ./dir
$ kubectl create -f http://www.fpaste.org/279276/48569091/raw/
查看并且找到资源:
$ kubectl get services
$ kubectl get pods --all-namespaces
$ kubectl get pods -o wide
$ kubectl get rc
$ kubectl get pods -l env=production
$ kubectl get services --sort-by=.metadata.name
修改以及删除资源:
$ kubectl label pods new-label=awesome
$ kubectl annotate pods icon-url=http://goo.gl/XXBTWq
$ kubectl delete pod pingredis-XXXXX
扩容缩容:
$ kubectl scale --replicas=3 deployment nginx
和运行着的Pod交互:
$ kubectl logs
# 运行tail -f 得到日志输出
$ kubectl logs -f
# 以交互shell运行pod
$ kubectl run -i --tty busybox --image=busybox -- sh
# 连接到运行着的容器里
$ kubectl attach -i
# 将Pod的端口转发到本地机器
$ kubectl port-forward <local-and-remote-port>
# 将端口转发到服务
$ kubectl port-forward
# 在已有pod里运行命令(仅有1个容器的情况下)
$ kubectl exec -- ls /
# 在已有pod里运行命令(多个容器的情况下)
$ kubectl exec -c -- ls /
DNS查找:
$ kubectl exec busybox -- nslookup kubernetes
$ kubectl exec busybox -- nslookup kubernetes.default
$ kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
创建并暴露部署:
$ kubectl run nginx --image=nginx:1.9.12
$ kubectl expose deployment nginx --port=80 --type=LoadBalancer
总结