中文版:https://kubernetes.io/zh/node
一旦搭建好Kubernetes环境后,后续对于应用的部署与运维,使用Kubernetes就很是方便了mysql
Kubernetes的安装先不讲了git
下面的几个yaml文件在github
https://github.com/nbcoolkid/learning/tree/master/k8sweb
apiVersion: v1 # 表名这是一个副本集 kind: ReplicationController metadata: # RC的名称,全局惟一 name: mysql spec: # 期待的Pod数量 replicas: 1 selector: app: mysql # 根据此模板建立Pod副本 template: metadata: labels: # Pod副本拥有的标签,对应RC的Selector app: mysql spec: containers: - name: mysql image: registry.cn-hangzhou.aliyuncs.com/sherry/mysql:5.7 ports: # 容器应用监听的端口号 - containerPort: 3306 # 注入容器内的环境变量 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
注意这里的yaml文件,不能够有制表符,咱们一概使用空格键代替redis
编写完文件后,使用apply命令作个文件格式检查sql
➜ k8s git:(master) ✗ kubectl apply -f mysql-rc.yaml replicationcontroller/mysql created
➜ k8s git:(master) ✗ kubectl create -f mysql-rc.yaml replicationcontroller/mysql created
➜ k8s git:(master) ✗ kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 1 4m17s
➜ k8s git:(master) ✗ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-wg9sp 1/1 Running 0 5m16s
其实经过dashboard,也能看到启动状况docker
apiVersion: v1 kind: Service # 表名这是一个Kubernetes Service metadata: name: mysql # Service全局名称 spec: ports: - port: 3306 # Service对外提供的端口 selector: app: mysql # Service对应的Pod拥有此标签,全部拥有此标签的pod都归我管
➜ k8s git:(master) ✗ kubectl create -f mysql-svc.yaml service/mysql created
➜ k8s git:(master) ✗ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 175m mysql ClusterIP 10.105.55.185 <none> 3306/TCP 84s
能够发现,MySQL服务被分配了一个值为10.105.55.185
的CLUSTER-IP
,端口为3306api
此时,Kubernetes集群中其余建立的Pod就能够经过这个ip+端口进行链接和访问了
这里的ip,是Service建立后由Kubernetes系统自动分配的,
其余Pod没法余弦知道,因此须要有一个服务发现机制来找到这个服务。
如今,咱们根据Service的惟一名称获取到ip和端口
apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080
在Tomcat容器内部,应用将使用环境变量MYSQL_SERVICE_HOST的值链接MySQL,更安全的作法是使用服务的名称mysql进行访问
➜ k8s git:(master) ✗ kubectl create -f myweb-rc.yaml replicationcontroller/myweb created
➜ k8s git:(master) ✗ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-ck4j5 1/1 Running 0 164m myweb-8dhr9 1/1 Running 0 3m11s myweb-nm75w 1/1 Running 0 3m11s
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
type: NodePort
和nodePort: 30001
,代表此Service开启了NodePort
方式的外网访问模式
➜ k8s git:(master) ✗ kubectl create -f myweb-svc.yaml service/myweb created
➜ k8s git:(master) ✗ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h47m mysql ClusterIP 10.105.55.185 <none> 3306/TCP 174m myweb NodePort 10.101.31.133 <none> 8080:30001/TCP 41s
通过上述步骤,咱们经过dashbaord查看到底启动了哪些服务
咱们可使用 http://虚拟机ip:30001/demo/
的方式来进行验证访问
那么怎么获取这个虚拟机的ip呢?
我这里使用的是minikube安装的Kubernetes环境,安装后,在虚拟机中的Linux,帐号是root,密码为空
而后使用ipconfig|more
命令就能看到ip
ok,至此,咱们的hello world完毕
Kubernetes中的大部分概念,包括Node、Pod、Replication Controller、Service,均可以被看作一种资源对象
几乎全部的资源对象均可以经过kubectl进行增删改查操做,并持久化到etcd中
声明当前这个资源对象归属于v1这个核心API
大部分的资源对象都归属于v1这个核心API
Kubernetes集群的控制节点,通常在生产环境至少部署3台做为高可用
全部的Kubernetes指令都是发给Master,由Master去管理集群中的节点
Pod运行在Node上
Pod有一个Pause根容器
Pod内容器能够和Kubernetes集群中任意的Pod内的容器进行直接通讯
PodIP+容器端口=Endpoint,表明此Pod内的某个服务的对外通讯地址
能够配置Pod对资源指望的最低要求和最高要求(CPU、内存)
resources: # 设置一个较小的值,符合容器平时工做负载下的资源需求 requests: # 内存占用,默认单位为字节,通常咱们使用Mi,表示兆 memory: "64Mi" # 以1/1000为最小单位,100m表示0.1个CPU # 不论是在一个1Core的机器仍是8Core的机器上,100m表明的含义都是同样的 cpu: "250m" # 设置一个较大的值,符合容器峰值负载下的资源需求 # 当容器试图使用超过这个量的资源时,可能被Kubernetes杀掉并重启 limits: memory: "128Mi" cpu: "500m"
,
分割AND
关系
确保拥有tier=frontend
标签的Pod在Kubernetes集群中始终只有一个副本
为了更好的解决Pod的编排问题,Deployment内部使用Replica Set
咱们把Deployment当作一次RC的升级便可
HPA用于实现Pod的横向自动扩容
Kubernetes内部的服务,最终是经过Service暴露出去的
Service整个生命周期内,拥有惟一不变的ip
命名空间,通常用于实现多租户的资源个例
本文由博客一文多发平台 OpenWrite 发布!