中文版:https://kubernetes.io/zh/node
Kubernetes中的大部分概念,如:Node、Pod、Replication Controller、Service,均可以被视做一种资源对象。几乎全部的资源对象均可以经过Kubernetes提供的kubectl
工具执行CRUD,并将其保存在etcd中进行持久化存储。mysql
从这个角度看,Kubernetes是一个高度自动化的资源控制系统linux
它经过比较etcd中保存的资源指望值与当前环境的实际资源状态之间的差别,实现自动控制和自动纠错的高级功能git
反正就是一台机器就对了web
一般一个节点运行几百个Podsql
副本集docker
它可以保证Pod持续运行,而且在任什么时候候都有指定数量的Pod副本,在此基础上提供一些高级特性,好比滚动升级和弹性伸缩api
RC会在每一个节点上建立Pod,Pod上若是有相应的Images能够直接建立,若是没有,则会拉取这个镜像再进行建立tomcat
在Kubernetes集群中,只要为须要扩容的Service关联到Pod建立的一个RC,服务扩容和升级就会变得很是简单
一个RC文件,包含如下三个关键信息
Replica Set是Replication Controller的下一代
当前惟一的区别就是RS支持基于集合的Label Selector
咱们不多单独设置RS,主要是被Deployment这个更高层的资源对象所使用
从而造成一整套Pod建立、删除、更新的编排机制
Replica Set和Deployment这两个重要的资源对象,主键替代了RC的做用
为了更好的解决Pod的编排问题,Deployment内部使用Replica Set
咱们把Deployment当作一次RC的升级便可
Pod是Kubernetes管理的最小运行单元
一个Pod规定了其可以使用的硬件资源,达到隔离的做用
Pod内运行一个特殊的Container---Pause,在Pod内的其余Container,共享Pause的网络栈和Volume挂载卷
镜像启动后,就是Container
Container运行在Pod中,多个紧密相关联的Container,咱们通常会让他们运行在同一个Pod
Kubernetes中的各个对象,均可以打上Label标签
标签是name=mysql
这样子的键值对
一个资源对象能够定义任意数量的Label,同一个Label也能够被添加到任意数量的资源对象上
Master是集群控制节点
Master上一般还部署etcd服务,由于Kubernetes里的全部资源对象数据都保存在etcd中
Kubernetes的安装先不讲了
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 <none> 443/TCP 175m mysql ClusterIP 10.105.55.185 <none> 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容器内部,应用将使用环境变量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完毕
在hello world中,咱们已经使用yaml
格式的方式,声明了RC和Service两种资源对象
其实还能够是JSON格式(不经常使用)
下面咱们具体讲讲每个配置
# 声明须要用到的api版本 #Kubernetes平台采用的是核心+外围扩展的设计思路 #常见的核心资源对象都归属于v1这个核心api apiVersion: v1 # 表名这是一个副本集,还能够是 Pod、Service等 kind: ReplicationController metadata: # RC的名称,全局惟一 name: mysql labels: name: XXX # 定义了一个标签,name=XXX # 定义容器组 spec: # 期待的Pod数量 replicas: 1 # selector是标签选择器,这里表示,当前容器组处理拥有app=mysql标签的Pod 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 resources: # 设置一个较小的值,符合容器平时工做负载下的资源需求 requests: # 内存占用,默认单位为字节,通常咱们使用Mi,表示兆 memory: "64Mi" # 以1/1000为最小单位,100m表示0.1个CPU # 不论是在一个1Core的机器仍是8Core的机器上,100m表明的含义都是同样的 cpu: "250m" # 设置一个较大的值,符合容器峰值负载下的资源需求 # 当容器试图使用超过这个量的资源时,可能被Kubernetes杀掉并重启 limits: memory: "128Mi" cpu: "500m" ports: # 容器应用监听的端口号,PodIP+这个端口,组成了新的概念:Endpoint # 表明此Pod里的一个服务进程的对外通讯地址 - containerPort: 3306 # 注入容器内的环境变量 env: - name: MYSQL_SERVICE_HOST value: "mysql" - name: MYSQL_ROOT_PASSWORD value: "123456"
详细命令的使用,经过kubectl help
得到
➜ k8s git:(master) ✗ kubectl get nodes NAME STATUS ROLES AGE VERSION minikube Ready master 8h v1.16.2
这里的minikube是node的name
➜ k8s git:(master) ✗ kubectl describe node minikube Name: minikube Roles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=minikube kubernetes.io/os=linux node-role.kubernetes.io/master= Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Wed, 04 Dec 2019 10:02:05 +0800 Taints: <none> Unschedulable: false Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- MemoryPressure False Wed, 04 Dec 2019 18:12:44 +0800 Wed, 04 Dec 2019 10:02:01 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Wed, 04 Dec 2019 18:12:44 +0800 Wed, 04 Dec 2019 10:02:01 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Wed, 04 Dec 2019 18:12:44 +0800 Wed, 04 Dec 2019 10:02:01 +0800 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Wed, 04 Dec 2019 18:12:44 +0800 Wed, 04 Dec 2019 10:02:01 +0800 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.99.105
本文由博客一文多发平台 OpenWrite 发布!