侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

2-kubernetes-hello wrold

2023-11-06 星期一 / 0 评论 / 0 点赞 / 31 阅读 / 10321 字

#这里的hello world的意思实现一个Web留言板功能,并且是一个基于PHP+Redis两层分布式架构的web应用,前端PHP Web网站通过访问后端Redis完成留言查询和添加,redis具备

#这里的hello world的意思实现一个Web留言板功能,并且是一个基于PHP+Redis两层分布式架构的web应用,前端PHP Web网站通过访问后端Redis完成留言查询和添加,redis具备读写分离功能,本实例就实现此需求#留言板系统部署#redis采用一个master两个salve,master实现写,slave实现读,php web启动三个实例组成集群,实现负载均衡#主要是为了体验kubernetes安装中的一些解释不做详细解释环境说明:centos 7[root@localhost ~]# uname -r3.10.0-514.el7.x86_64[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)1.关闭防火墙和selinux[root@localhost ~]# systemctl disable firewalld.service[root@localhost ~]# systemctl stop firewalld.service[root@localhost ~]# setenforce 0[root@localhost ~]# getenforce Disabled或者Permissive2.安装etcd和kubernetes[root@localhost ~]# yum install etcd kubernetes3.修改配置文件[root@localhost ~]# vim /etc/sysconfig/dockerOPTIONS='--selinux-enabled=false --insecure-registry gcr.io'[root@localhost ~]# vim /etc/kubernetes/apiserverKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"把ServiceAccount去掉4.启动按顺序启动[root@localhost ~]# systemctl start etcd[root@localhost ~]# systemctl start docker[root@localhost ~]# systemctl start kube-apiserver[root@localhost ~]# systemctl start kube-controller-manager[root@localhost ~]# systemctl start kube-scheduler[root@localhost ~]# systemctl start kubelet[root@localhost ~]# systemctl start kube-proxy至此一个单机版kubernetes集群环境已经安装并启动了下面下载docker镜像了https://hub.docker.com/u/kubeguide/ 所需docker镜像可以下载5.1创建redis-master Pod和服务先定义一个Service,然后定义个RC来创建和控制关联Pod,或者先定义RC来创建Pod然后在于Service管理这里选则RC---->Pod--->Service首先创建一个名为redis-master的RC定义文件redis-master-controller.yaml[root@localhost ~]# vim redis-master-controller.yamlapiVersion: v1kind: ReplicationControllermetadata:  name: redis-master  labels:    name: redis-masterspec:  replicas: 1  selector:    name: redis-master  template:    metadata:      labels:        name: redis-master    spec:      containers:      - name: master        image: kubeguide/redis-master        ports:        - containerPort: 6379启动kind: ReplicationController表示这是一个RC,sepc.selector是RC的Pod选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里是1,表示只能运行一个名为redis-master的Pod实例,当集群中运行的Pod数量小雨replicas时,RC会根据spec.template段定义的Pod模版来生成一个新的Pod实例,labels属性指定了该Pod的标签,注意这里的labels必须匹配RC的spec.selector[root@localhost ~]# kubectl create -f redis-master-controller.yaml replicationcontroller "redis-master" created[root@localhost ~]# kubectl get rcNAME           DESIRED   CURRENT   READY     AGEredis-master   1         1         0         15s[root@localhost ~]# kubectl get podsNAME                 READY     STATUS              RESTARTS   AGEredis-master-1t0n6   0/1       ContainerCreating   0          8m[root@localhost ~]# kubectl get podsNAME                 READY     STATUS              RESTARTS   AGEredis-master-1t0n6   0/1       ContainerCreating   0          9m[root@localhost ~]# kubectl get podsNAME                 READY     STATUS    RESTARTS   AGEredis-master-1t0n6   1/1       Running   0          14m可以看到会有一个创建过程知道RUNNING之后表示正常5.2创建redis-master-service提供Redis服务的Pod已经创建并正常运行了,接下来创建一个与之关联的Service,redis-master的定义文件[root@localhost ~]# vim redis-master-service.yaml apiVersion: v1kind: Servicemetadata:  name: redis-master  labels:    name: redis-masterspec:  ports:  - port: 6379    targetPort: 6379  selector:    name: redis-master其中metadata.name是Service的服务名,spec.selector确定了那些Pod对应的本服务,这里定义表明拥有redis-master标签的Pod属于redis-master服务,另外ports部分的targetPort属性来确定提供该服务的容器暴露EXPOSE的端口号,具体的服务进程在容器内的targetPort上提供服务,而port属性定义了Service的虚端口[root@localhost ~]# kubectl create -f redis-master-service.yaml service "redis-master" created[root@localhost ~]# kubectl get servicesNAME           CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGEkubernetes     10.254.0.1     <none>        443/TCP    37mredis-master   10.254.249.4   <none>        6379/TCP   1m注意到redis-master服务分配一个值为10.254.249.4的ip地址虚拟ip随后kubernetes集群中其他新建的Pod就可以通过这个虚拟ip的6379访问了,还要创建redis-slave和frontend两组Pod都将通过10.254.249.4:6379来访问redis-master服务但是用于IP地址是在服务创建后由kubernetes系统自动分配的,在其他Pod中无法预先知道某个Service的虚拟IP地址,因此需要一个机制来找到这个服务,为此kubernetes使用linux环境变了,在为每个Pod容器里都增加了一组Service相关的环境变量,用来记录从服务名到虚拟Ip地址的映射关系,以redis-master服务为例,在容器的环境变量中会增加下面两条记录REDIS_MASTER_SERVICE_HOST=10.254.249.4REDIS_MASTER_SERVICE_PORT=6379于是redis-slave和frontend等Pod中应用程序就可以通过环境变量得到相关信息5.3创建redis-slave Pod依然先创建RC[root@localhost ~]# vim redis-slave-controller.yamlapiVersion: v1kind: ReplicationControllermetadata:  name: redis-slave  labels:    name: redis-slavespec:  replicas: 2  selector:    name: redis-slave  template:    metadata:      labels:        name: redis-slave    spec:      containers:      - name: slave        image: kubeguide/guestbook-redis-slave        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 6379[root@localhost ~]# kubectl create -f redis-slave-controller.yaml replicationcontroller "redis-slave" created[root@localhost ~]# kubectl get rcNAME           DESIRED   CURRENT   READY     AGEredis-master   1         1         1         35mredis-slave    2         2         0         8s[root@localhost ~]# kubectl get podsNAME                 READY     STATUS              RESTARTS   AGEredis-master-1t0n6   1/1       Running             0          35mredis-slave-0nh1g    0/1       ContainerCreating   0          15sredis-slave-cz342    0/1       ContainerCreating   0          15s为了实现Redis集群的主从同步,redis-slave需要知道redis-master的地址,所以在redis-slave镜像启动命令/run.sh中我们可以输入以下内容redis-server --salveof ${REDIS_MASTER_SERVICE_HOST} 6379由于在创建redis-salve Pod时系统自动在容器内部生成了与redis-master Service相关的环境变量,所以redis-slave应用能够直接使用环境变量来进行获取redis-master的ip地址5.4创建redis-slave Service[root@localhost ~]# cat redis-slave-service.yaml apiVersion: v1kind: Servicemetadata:  name: redis-slave  labels:    name: redis-slavespec:  ports:  - port: 6379    targetPort: 6379  selector:    name: redis-slave[root@localhost ~]# kubectl create -f redis-slave-service.yaml service "redis-slave" created[root@localhost ~]# kubectl get servicesNAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGEkubernetes     10.254.0.1       <none>        443/TCP    53mredis-master   10.254.249.4     <none>        6379/TCP   17mredis-slave    10.254.168.208   <none>        6379/TCP   8s5.5创建frontend Pod[root@localhost ~]# cat frontend-controller.yaml apiVersion: v1kind: ReplicationControllermetadata:  name: frontend  labels:    name: frontendspec:  replicas: 3  selector:    name: frontend  template:    metadata:      labels:        name: frontend    spec:      containers:      - name: master        image: kubeguide/guestbook-php-frontend        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 80[root@localhost ~]# kubectl create -f frontend-controller.yaml replicationcontroller "frontend" created[root@localhost ~]# kubectl get rcNAME           DESIRED   CURRENT   READY     AGEfrontend       3         3         0         5sredis-master   1         1         1         48mredis-slave    2         2         2         13m[root@localhost ~]# kubectl get podsNAME                 READY     STATUS              RESTARTS   AGEfrontend-kkb8q       0/1       ContainerCreating   0          12sfrontend-p5hwm       0/1       ContainerCreating   0          12sfrontend-r70dz       0/1       ContainerCreating   0          12sredis-master-1t0n6   1/1       Running             0          48mredis-slave-0nh1g    1/1       Running             0          13mredis-slave-cz342    1/1       Running             0          13m5.6创建frontend Service[root@localhost ~]# cat frontend-service.yaml apiVersion: v1kind: Servicemetadata:  name: frontend  labels:    name: frontendspec:  type: NodePort  ports:  - port: 80    nodePort: 30001  selector:    name: frontend这里的关键点设置type: NodePort并指定一个NodePort的值,表示使用Node上的物理机端口提供对外访问能力,需要注意的是spec.ports.NodePort的端口号定义范围是有限制的,默认30000-32767,如果使用范围外的端口号Service将会失败[root@localhost ~]# kubectl create -f frontend-service.yaml service "frontend" created[root@localhost ~]# kubectl get servicesNAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGEfrontend       10.254.91.211    <nodes>       80:30001/TCP   7skubernetes     10.254.0.1       <none>        443/TCP        1hredis-master   10.254.249.4     <none>        6379/TCP       31mredis-slave    10.254.168.208   <none>        6379/TCP       14m5.7验证打开浏览器输入http://本机的物理IP:30001能看到欢迎页面至此完成kubernetes的hello world例子

 

广告 广告

评论区