之前的k8s博客我们已经把k8s的基本概念了解了一遍,现在我们用一个简单的案例来熟悉k8s的基本知识
Pod Pod是k8s的基本操作单元,也是应用运行的载体。整个kubernetes系统都是围绕着Pod展开的。
我们来创建一个nginxapp来开始介绍Pod 新建一个nginxapp.yaml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion: v1 kind: Pod metadata: name: nginxapp labels: app: nginxapp spec: containers: - name: nginxapp image: nginx resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80
上述的定义文件中描述了Pod的属性和行为,其中主要的要素如下
apiVersion: 声明k8s的API的版本,当前是v1.
kind:声明 API对象的类型,这里是Pod
metadata:设置Pod的元数据
name:指定Pod的名称,注意,Pod名称必须在NameSpace内是唯一的。
labels: 指定kv 标志
spec:配置Pod的具体规格。
restartPolicy: 设置Pod的重启策略
containers:设置Pod中窗口的规格,数组形式,每一项定义一个容器。
name: 指定容器的名称,在Pod的定义中是唯一有
image: 指定容器的镜像
command: 设置容器的启动命令
resources: 设置容器启动的资源的情况
创建好这个Pod之后,使用kubectl get pod 可以查看到这个Pod的执行情况。
执行 kubectl exec 之后可以看到nginx已经正常的运行中
Service 此时的pod还不能访问到,我们需要创建一个service
我们创建一个service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: v1 kind: Service metadata: name: nginxapp labels: app: nginxapp spec: type: NodePort ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30002 selector: app: nginxapp
从上面的yaml的配置信息可以看出 使用了 nodePort的 service协议,指定了30002访问 nginxapp 并且 nginxapp的规则是 nodePort: 30002 -> port: 80 ->targetPort: 80 并且 匹配的labels规则是 app: nginxapp 就是之前定义的Pod
创建之后访问可以看到 nodeip:30002 可以看到nginx的默认页面。
ConfigMap
ConfigMap API资源用来保存key-value pair配置数据,这个数据可以在pods里使用,或者被用来为像controller一样的系统组件存储配置数据。虽然ConfigMap跟Secrets类似,但是ConfigMap更方便的处理不含敏感信息的字符串。 注意:ConfigMaps不是属性配置文件的替代品。ConfigMaps只是作为多个properties文件的引用。你可以把它理解为Linux系统中的/etc目录,专门用来存储配置文件的目录。
现在我想在访问 nodeip:30002 的时候可以访问到 http://yahui.wang/的内容 只需要给nginx中添加一个代理配置
现在我们来定义 需要的 ConfigMap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 apiVersion: v1 kind: ConfigMap metadata: name: nginxconfs data: nginxconf: | worker_processes 1 ; events { worker_connections 1024 ; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65 ; server_tokens off; include conf.d/*.conf; } nginxconfddefaultconf: | upstream yahui{ server yahui.wang:80 ; keepalive 64 ; } server{ listen 80 ; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true ; proxy_set_header Connection "" ; proxy_pass http://yahui; client_max_body_size 1000m; } }
我们修改nginxapp来使用定义好的ConfigMap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 apiVersion: v1 kind: Pod metadata: name: nginxapp labels: name: nginxapp spec: containers: - name: nginxapp image: nginx resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80 volumeMounts: - name: nginx-config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf - name: nginx-config mountPath: /etc/nginx/conf.d/default.conf subPath: default.conf volumes: - name: nginx-config configMap: name: nginxconfs items: - key: nginxconf path: nginx.conf - key: nginxconfddefaultconf path: default.conf
执行 kubectl repleace 替换 nginxapp Pod
访问 nodeip:30002可以看到页面内容和 http://yahui.wang 的内容一样
多个Service 接下来我们创建一个自定义的Service来让nginx转发http数据
定义 Dockerfile
1 2 3 4 5 FROM node:7 ADD app.js /app.js ENTRYPOINT ["node" ,"app.js" ]
在Dockerfile 同目录创建 app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 const http=require ("http" );const os=require ("os" );console .log("yahui server staring..." );var header=function (request,response ) { console .log("Recoive request from " +request.connection.remoteAddress) response.writeHead(200 ); response.end("you have hit " +os.hostname()+"\n" ); } var www=http.createServer(header);www.listen(8080 );const http=require ("http" ); const os=require ("os" );console .log("yahui server staring..." );var header=function (request,response ) { console .log("Recoive request from " +request.connection.remoteAddress) response.writeHead(200 ); response.end("you have hit " +os.hostname()+"\n" ); } var www=http.createServer(header);www.listen(8080 );
在执行 docker build -t yahuiwong/yahui . 生成 yahuiwong/yahui:latest 镜像 然后执行 docker push yahuiwong/yahui:latest
接下来使用这个镜像创建 Pod和Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 apiVersion: v1 kind: Pod metadata: name: yahuiapp labels: name: yahuiapp spec: containers: - name: yahuiapp image: yahuiwong/yahui resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: yahuiapp1 labels: app: yahuiapp1 spec: ports: - protocol: TCP port: 8080 selector: name: yahuiapp
并且 修改 ConfigMap中 nginxconfddefaultconf 中的upstream 为 server yahuiapp1:8080 ;
创建 pod和service之后并且更新nginxapp之后 访问nodeip:30002 可以看到 Pod yahuiapp的内容
ReplicationController ReplicationController是k8s的另外一个核心的概念。ReplicationController保证应用可以在k8s中可以持续运行。用以确保在任何时候在k8s中有指定数量的Pod实例运行。当然 在ReplicationController的基础上可以做一些高级的事情,比如 弹性伸缩、滚动升级等。
接下来我们定义一个ReplicationController 确保 yahuiapp有两个副本运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 apiVersion: v1 kind: ReplicationController metadata: name: yahuiapp labels: name: yahuiapp spec: replicas: 2 selector: app: yahuiapp template: metadata: labels: app: yahuiapp name: yahuiapp spec: containers: - name: yahuiapp image: yahuiwong/yahui resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 8080
通过上面的配置信息可以看到 template中的内容和之前的Pod的内容一样 ReplicationController用到的主要配置是
spec: 配置ReplicationController的具体规格
replicas:设置ReplicationController 控制的Pod的副本数目
selector:制定ReplicationController的Label Selector来匹配Pod的Label
template:设置Pod的模板,同Pod的定义一致。
创建ReplicationController之后可以看到Pod的名称后五位是随机字符串
访问 nodeip:30002多刷新几次可以看到
you have hit yahuiapp-x7hnq 或者 you have hit yahuiapp-1xusp
证明此时运行状态正常,我们的服务部署成功。