首先,我们开始准备Kubernetes的安装和相关镜像下载,本书建议采用VirtualBox 或者VMwareWorkstation在本机虚拟一个64位的CentOS 7虚拟机作为学习环境,虚拟机 采用NAT的网络模式以便能够连接外网,然后按照以下步骤快速安装Kubernetes。 

(1)关闭CentOS自带的防火墙服务: 

# systemctl disable firewalld

# systemctl stop firewalld 

(2)安装etcd和Kubernetes软件(会自动安装Docker软件): 

#yum install -y etcd kubernetes 

(3)安装好软件后,修改两个配置文件(其他配置文件使用系统默认的配置参数 即可)。Docker配置文件为/etc/sysconfig/docker,其中OPTIONS的内容设置为: 

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io' 

Kubernetes apiserver配置文件为/etc/kubernetes/apiserver,把--admission_control参数 中的ServiceAccount删除。 

(4)按顺序启动所有的服务: 

#systemctl start etcd 

#systemctl start docker 

#systemctl start kube-apiserver 

#systemctl start kube-controller-manager 

#systemctl start kube-scheduler 

#systemctl start kubelet #systemctl start kube-proxy 至此,一个单机版的Kubernetes集群环境就安装启动完成了。接下来,我们可以在这个单机版的Kubernetes集群中上手练习了。

首先为MySQL服务创建一个RC定义文件:mysql-rc.yaml,下面给出了该文件的完 整内容和解释,如图

k8s 从一个简单的例子开始_java

创建好redis-master-controller.yaml文件以后,为了将它发布到Kubernetes集群中, 我们在Master节点执行命令:

# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created 接下来,我们用kubectl命令查看刚刚创建的RC: 

# kubectl get rc

NAME DESIRED CURRENT AGE mysql 1 1 7m 

查看Pod的创建情况时,可以运行下面的命令: 

# kubectl get pods

我们看到一个名为mysql-xxxxx的Pod实例,这是Kubernetes根据mysql这个RC的定义 自动创建的Pod。由于Pod的调度和创建需要花费一定的时间,比如需要一定的时间来 确定调度到哪个节点上,以及下载Pod里容器的镜像需要一段时间,所以一开始我们看 到Pod的状态将显示为Pending。当Pod成功创建完成以后,状态最终会被更新为 Running。我们通过docker ps指令查看正在运行的容器,发现提供MySQL服务的Pod容器已经 创建并正常运行了,此外,你会发现MySQLPod对应的容器还多创建了一个来自谷歌 的pause容器,这就是Pod的“根容器”。 

# docker ps |grep mysql 

72ca992535b4 mysql      "docker-entrypoint.sh" 12 minutes ago Up 1 76c1790aad27 gcr.io/google_containers/pause-amd64:3.0 "/pause" 12 minutes ago 

最后,我们创建一个与之关联的Kubernetes Service——MySQL的定义文件(文件 名为mysql-svc.yaml),完整的内容和解释如图



其中,metadata.name是Service的服务名(ServiceName);port属性则定义了 Service的虚端口;spec.selector确定了哪些Pod副本(实例)对应到本服务。类似地, 我们通过kubectl create命令创建Service对象。 

运行kubectl命令,创建service: 

# kubectl create -f mysql-svc.yaml 

service "mysql" created 

运行kubectl命令,可以查看到刚刚创建的service: 

# kubectl get svc 

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql 169.169.253.143 <none> 3306/TCP 48s

注意到MySQL服务被分配了一个值为169.169.253.143的ClusterIP地址,这是一个虚 地址,随后,Kubernetes集群中其他新创建的Pod就可以通过Service的ClusterIP+端口号 6379来连接和访问它了。在通常情况下,ClusterIP是在Service创建后由Kubernetes系统自动分配的,其他 Pod无法预先知道某个Service的ClusterIP地址,因此需要一个服务发现机制来找到这个 服务。为此,最初的时候,Kubernetes巧妙地使用了Linux环境变量(Environment  Variable)来解决这个问题,后面会详细说明其机制。现在我们只需知道,根据Service 的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而 发起TCP/IP连接请求了。

上面我们定义和启动了MySQL服务,接下来我们采用同样的步骤,完成Tomcat应 用的启动过程。首先,创建对应的RC文件myweb-rc.yaml,内容如下:


k8s 从一个简单的例子开始_java_02

注意到上面RC对应的Tomcat容器里引用了MYSQL_SERVICE_HOST=mysql这个环 境变量,而“mysql”恰好是我们之前定义的MySQL服务的服务名,运行下面的命令,完 成RC的创建和验证工作: 

#kubectl create -f myweb-rc.yaml 

replicationcontroller "myweb" created 

#kubectl get pods 

NAME READY STATUS RESTARTS AGE mysql-c95jc 1/1 Running 0 2h myweb-g9pmm 1/1 Running 0 3s 

最后,创建对应的Service。以下是完整的yaml定义文件(myweb-svc.yaml): 

apiVersion: v1 

kind: Service 

metadata: name: myweb 

spec: 

    type: NodePort 

    ports: 

  - port: 8080 

    nodePort: 30001 

    selector: 

        app: myweb 

注意type=NodePort和nodePort=30001的两个属性,表明此Service开启了NodePort方 式的外网访问模式,在Kubernetes集群之外,比如在本机的浏览器里,可以通过30001 这个端口访问myweb(对应到8080的虚端口上)。运行kubectl create命令进行创建:# kubectl create -f myweb-svc.yaml You have exposed your service on an external port on all nodes in your cluster. If you want to expose this service to the external internet, you may need to set up firewall rules for the service port(s) (tcp:30001) to serve traffic. See http://releases.k8s.io/release-1.3/docs/user-guide/services-firewalls.md for more details. service "myweb" created


我们看到上面有提示信息,意思是需要把30001这个端口在防火墙上打开,以便外 部的访问能穿过防火墙。运行kubectl命令,查看创建的Service:

# kubectl get services

NAME     CLUSTER-IP EXTERNAL-IP     PORT(S) AGE   

mysql 169.169.253.143 <none> 3306/TCP 44m myweb 169.169.149.215 <nodes> 8080/TCP 4m kubernetes 169.169.0.1 <none> 443/TCP 16d



至此,我们的第1个Kubernetes例子搭建完成了