1. service
kubernetes中,Service(服务)是分布式集群架构的核心,一个Service对象拥有如下特征。
1. 拥有一个唯一指定的名字(如:mysql-server)
2. 拥有一个虚拟IP(Cluster IP, Service IP或VIP)和端口号
3. 能够提供某种远程服务能力
4. 被映射到了提供这种服务能力的一组容器应用上
Service 的服务进程目前都基于Socket通信方式对外提供服务,比如Redis,Memcache,MySql , Wwb Server或者是实现了某个具体业务的一个特点的Tcp Server进程,虽然一个Service通常是由多个相关的服务进程来提供服务的每个服务都有一个独立的Endpoint(IP+Port)访问点,但kubernetes能够让我们通过Service(虚拟Cluster IP +Service Port)连接到指定的Service上,有了Kubernetes内建的透明负载均衡和故障恢复机制,不管后端多少服务进程,也不管某个服务进程是否会由于发生故障而重新部署到其他机器,都不会影响到我们对服务的正常调用。更重要的是这个Service 本身一旦创建就不再变化,这意味着,在Kubernetes
集群中,我们再也不用为了服务的IP地址变来变去的问题而头疼了。
容器提供了强大的隔离功能,所以有必要把为Service提供服务的这组进程放入容器中进行隔离。为此,Kubernetes设计了Pod对象,将每个服务进程包装到相应的Pod中,使其成为Pod中运行的一个容器(Container)。 为了建立Service和Pod间的关联关系,Kubernetes 首先给每个Pod贴上一个标签(Label), 给运行MySQL的Pod贴上name=mysql标签,给运行PHP的 Pod贴上name=php标签,然后给相应的Service 定义标签选择器(Label Selector),比如MySQLService的标签选择器的选择条件为name=mysql, 意为该Service要作用于所有包含name= -mysqlLabel的Pod上。这样一来,就巧妙地解决了Service 与Pod的关联问题。
2. pod
Pod 运行在一个我们称之为节点(Node)的环境中,这个节点既可以是物理机,也可以是私有云或者公有云中的一个虚拟机,通常在一个节点_上运行几百个Pod;其次,每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效,在设计时我们可以充分利用这-特性将--组密切相关的服务进程放入同一个Pod中;最后,需要注意的是,并不是每个Pod和它里面运行的容器都能“映射”到一个Service. 上,只有那些提供服务(无论是对内还是对外)的一组Pod才会被“映射”成一个服务。
3. rc
在Kubernetes 集群中,你只需为需要扩容的Service 关联的Pod 创建一个ReplicationController(简称RC),则该Service的扩容以至于后来的Service升级等头疼问题都迎刃而解。在一个RC定义文件中包括以下3个关键信息。
3.1 目标Pod的定义。
3.2 目标Pod需要运行的副本数量(Replicas)。
3.3 要监控的目标Pod的标签(Label)。
在创建好RC (系统将自动创建好Pod)后,Kubermnetes 会通过RC中定义的Label筛选出对应的Pod实例并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas), 则会根据RC中定义的Pod模板来创建-一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例的数量达到预定目标。这个过程完全是自动化的,无须人工干预。有了RC,
4.环境准备
centos 7环境
4.1 关闭自带防火墙
systemctl disable firewalld
systemctl stop firewalld
4.2 安装etcd和kubernetes(自动安装docker)
yum install -y etcd kubernetes
报错:
Error: docker-ce-cli conflicts with 2:docker-1.13.1-109.gitcccb291.el7.centos.x86_64
Error: docker-ce conflicts with 2:docker-1.13.1-109.gitcccb291.el7.centos.x86_64
解决:
yum list installed | grep docker #过滤出安装的docker 删除
yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64
1.3 修改配置,其他使用默认参数
docker 配置文件(/etc/sysconfig/docker),其中OPTIONS的配置内容为
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
kubernetes apiserver配置文件为/etc/kubernetes/apiserver,把--admission_control参数中的ServiceAccount删除
1.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完成
docker 下载镜像地址为:https://hub.docker.com/u/kubeguide
2 启动mysql 服务
2.1首先为mysql服务创建一个RC定义文件:mysql-rc.yaml.如下
apiVersion: v1
kind: ReplicationController #副本控制器---RC
metadata:
name: mysql #RC的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数量
selector:
app: mysql #符合目标的Pod拥有此标签
template: #根据此模板创建Pod的副本(实列)
metadata:
labels:
app: mysql #Pod副本拥有的标签,对用RC的selector
spec:
containers: #Pod内容器定义的部分
- name: mysql #容器的名称
image: mysql #容器对应的Docker Image
ports:
- containerPort: 3306 #容器暴露的端口号
env: #注入容器内的环境变量
- name: MYSQL_ROOT_PASSRD
value: "123456"
yaml定义文件中的kind 属性,用来表明此资源对象的类型,比如这里的值为"ReplicationController",表示这是一个RC;spec 一节中是RC的相关属性定义,比如 spec.selector是RC的poad标签(Label)选择器,即监控和管理拥有这些标签的pod实例,确保当前集群上始终有且仅有replicas个pod实例在运行,这里设置replicas=1表示只能运行一个mysql pod实例,当集群中运行的pod数量小于replicas时,RC会根据spec.template一节中定义的pod模板来生成一个新的pod实例,spec.template.metadata.labels指定了该pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每次创建一个无法匹配label的pod,就会不停的尝试创建新的pod,
创建好redis-master-controller.yaml文件以后,为了将它发布到kubernetes集群中,我们在master节点上执行命令
kubectl create -f mysql-rc.yaml
查看创建的rc
kubectl get rc
查看pod创建的情况
kubectl get pod
看到一个mysql-xxxx的pod实例,这是kubernetes根据mysql这个rc的定义自动创建的pod.由于pod的调度和创建需要花费一定的时间,比如需要一定时间来确定调度到那个节点上,以及下载pod里容器的镜像需要一段时间,一开始我们看到的pod的状态是pending,当pod成功创建完成以后,状态最终会被更新为running
我们通过docker ps指令查看正在运行的容器,发现提供pod容器已经正在运行了,此外,mysql pod 对应的容器还多创建了一个来自谷歌的pause容器,这就是pod的"根容器"
创建一个与之关联的kubernetes Service------mysql 的定义文件
##mysql-svc.yaml
apiVersion: v1
kind: Service #表明是Kubernetes Service
metadata:
name: mysql #Service的全局唯一名称
spec:
ports:
- port: 3306 #Service 提供服务的端口号
selector: #Service 对应的Pod拥有这里定义的标签
app: mysql
其中,metadata.name是service的服务名(ServiceName); port属性则定义了Service的虚端口;spec.selector确定了哪些pod副本(实例)对应到本服务,类似地,我们通过kubectl create命令创建service对象
创建service
[root@server /data/mysql]# kubectl create -f mysql-svc.yaml
service "mysql" created
[root@server /data/mysql]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4d
mysql 10.254.190.45 <none> 3306/TCP 10s
注意:mysql服务被分配了一个值为10.254.190.45的cluster ip地址,这是一个虚地址,随后,kubernetes集群中其他新建的pod就可以通过service的cluster ip+端口号 6379来链接和访问
在通常情况下,cluster ip是在service创建后由kubernetes系统自动分配到的,其他pod无法预先知道某个service的cluster ip地址,因此需要一个服务发现机制来找到这个服务,为此最初的时候,kubectl巧妙的利用linux环境变量(Environment Variable)来解决这个问题,根据service的唯一名字,容器可以从环境变量中获取到service对应的cluster ip,从而发起TCP/IP链接请求
3.启动tomcat服务
3.1 创建myweb-rc.yaml文件
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 1
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
注意到上面rc对应的Tomcat容器引用MYSQL_SERVICE_HOST=mysql这个环境变量,而"mysql" 恰好是我们之前定义的MYSQL服务的服务名,完整rc的创建和体验
kubectl create -f myweb-rc.yaml
[root@server /data/tomcat]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-t98m9 1/1 Running 0 6h
myweb-r7cft 1/1 Running 0 7s
创建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这个端口访问mweb(对应到8080的虚拟端口上)
通过浏览器访问:
192.168.1.52:30001/demo
报错解决:
https://blog.csdn.net/wanchaopeng/article/details/100928465