https://kubernetes.io/
中文版:https://kubernetes.io/zh/
一旦搭建好Kubernetes环境后,后续对于应用的部署与运维,使用Kubernetes就非常方便了
Kubernetes的安装先不讲了
下面的几个yaml文件在
https://github.com/nbcoolkid/learning/tree/master/k8s
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文件,不可以有制表符,我们一律使用空格键代替
编写完文件后,使用apply命令做个文件格式检查
➜ 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,也能看到启动情况
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 443/TCP 175m
mysql ClusterIP 10.105.55.185 3306/TCP 84s
可以发现,MySQL服务被分配了一个值为10.105.55.185
的CLUSTER-IP
,端口为3306
此时,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容器内部,应用将使用环境变量MYSQLSERVICEHOST的值连接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 443/TCP 5h47m
mysql ClusterIP 10.105.55.185 3306/TCP 174m
myweb NodePort 10.101.31.133 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去管理集群中的节点
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 发布!