kubernetes的yum安装

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值