k8s部署-部署一个Web应用

准备工作
    首先准备Kubernets的环境,看完前几篇关于K8s的安装教程,相信都拥有了自己的Kubernets的环境,接下来准备来部署自己的第一个应用

关闭防火墙:
 systemctl disable firewalld
 systemctl stop firewalld
1
2
安装etcd和kubernetes(会自动安装Docker软件)
#由于centos mini版本没有ifconfig和netstat的命令。所以安装了net-tools的工具
yum -y install net-tools
yum install -g etcd kubernetes
#k8s、etcd和Docker软件版本查询
#---------k8s信息查询-------
#默认安装完成以后,看了一下k8s的版本,是v1.5.2# kubectl --version
Kubernetes v1.5.2
[root@spareribs ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
#--------docker信息查询--------
# docker version

Client:
Version:         1.12.6
API version:     1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version:      go1.7.4
Git commit:      88a4867/1.12.6
Built:           Mon Jul  3 16:02:02 2017
OS/Arch:         linux/amd64

Server:
Version:         1.12.6
API version:     1.24
Package version: docker-1.12.6-32.git88a4867.el7.centos.x86_64
Go version:      go1.7.4
Git commit:      88a4867/1.12.6
Built:           Mon Jul  3 16:02:02 2017
OS/Arch:         linux/amd64

#------etcd信息查询-------
etcdctl --version
etcdctl version: 3.1.9
API version: 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
修改配置文件
#修改Docker的OPTIONS配置
vi /etc/sysconfig/docker 
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
#修改k8s APIserver的配置文件
vi /etc/kubernetes/apiserver

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

1
2
3
4
5
6
7
8
9
10
11
注:不修改后期创建rc与pod的时候会出现pod无法创建但是rc能创建

生成rhsm证书文件

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

1
2
3
注:创建容器时需要从redhat站点下载pod-infrastructure:latest镜像,如果没有此证书文件会报错,Pod会一直显示ContainerCreating状态。

配置docker阿里云镜像加速
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
1
2
3
4
5
启动服务
#按顺序启动服务
systemctl start etcd
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
systemctl start docker
#查看当前启动的服务和端口
netstat -lntp
#------------------------------------------------------start-----------------------------------------------------
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:10250         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      2728/etcd
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      2728/etcd
tcp        0      0 127.0.0.1:10255         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      2906/kube-apiserver
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1353/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1993/master
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      2964/kubelet
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      3008/kube-proxy
tcp6       0      0 :::10251                :::*                    LISTEN      2953/kube-scheduler
tcp6       0      0 :::6443                 :::*                    LISTEN      2906/kube-apiserver
tcp6       0      0 :::10252                :::*                    LISTEN      2941/kube-controlle
tcp6       0      0 :::22                   :::*                    LISTEN      1353/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1993/master
tcp6       0      0 :::4194                 :::*                    LISTEN      2964/kubelet
#-------------------------------------------------------end----------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
启动Mysql应用
创建mysql的Deployment定义文件
mysql-dep.yaml文件内容如下:

apiVersion: extensions/v1beta1                  #apiserver的版本
kind: Deployment                                      #副本控制器deployment,管理pod和RS
metadata:
  name: mysql                                            #deployment的名称,全局唯一
spec:
  replicas: 1                                                #Pod副本期待数量
  selector:
    matchLabels:                                         #定义RS的标签
      app: mysql                                          #符合目标的Pod拥有此标签
  strategy:                                                  #定义升级的策略
    type: RollingUpdate                               #滚动升级,逐步替换的策略
  template:                                                #根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: mysql                                        #Pod副本的标签,对应RS的Selector
    spec:
      containers:                                          #Pod里容器的定义部分
      - name: mysql                                     #容器的名称
        image: mysql:5.7                               #容器对应的docker镜像
        volumeMounts:                                #容器内挂载点的定义部分
        - name: time-zone                            #容器内挂载点名称
          mountPath: /etc/localtime              #容器内挂载点路径,可以是文件或目录
        - name: mysql-data
          mountPath: /var/lib/mysql               #容器内mysql的数据目录
        - name: mysql-logs
          mountPath: /var/log/mysql              #容器内mysql的日志目录
        ports:
        - containerPort: 3306                         #容器暴露的端口号
        env:                                                   #写入到容器内的环境容量
        - name: MYSQL_ROOT_PASSWORD   #定义了一个mysql的root密码的变量
          value: "123456"
      volumes:                                             #本地需要挂载到容器里的数据卷定义部分
      - name: time-zone                              #数据卷名称,需要与容器内挂载点名称一致
        hostPath:
          path: /etc/localtime                        #挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
      - name: mysql-data
        hostPath:
          path: /data/mysql/data                   #本地存放mysql数据的目录
      - name: mysql-logs
        hostPath:
          path: /data/mysql/logs                    #本地存入mysql日志的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion:定义使用apiserver的哪个版本,可通过kubectl api-versions命令查看apiserver有哪些版本;
kind:用来表明此资源对象的类型,比如这里的值为“Deployment”,表示这是一个deployment;
spec:RS相关属性定义,spec.selector是RS的Pod标签(Label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里设置replicas=1表示只能运行一个Mysql Pod实例。
spec.strategy:定义Pod的升级方案,Recreate表示删除所有已存在的Pod,重新创建新的;RollingUpdate表示滚动升级,逐步替换的策略,滚动升级时支持更多的附加参数,例如设置最大不可用Pod数量,最小升级间隔时间等等。
spec.template:当集群中运行的Pod数量小于replicas时,RS会根据spec.template中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了该Pod的标签,需要特别注意的是,这里的labels必须匹配之前的spec.selector。
spec.template.spec.containers:容器的定义部分,包括容器的名称、使用的docker镜像、挂载数据卷、服务的端口号、变量等内容。
spec.template.spec.volumes:需要挂载到容器里的本地数据卷的定义部分,数据卷的名称要与容器内挂载点的名称一致,path定义本地的数据卷路径。
注:mysql-dep.yaml文件会创建deployment、RS、Pod和容器,创建过程需要先下载镜像,时间会比较久。

发布Mysql
kubectl create -f mysql-dep.yaml

#deployment "mysql" created
#查询Mysql信息和Pod信息

kubectl get deployment 
#----------------------------------------------------------
#NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
#mysql     1         1         1            1           8s
 
kubectl get rs
#NAME               DESIRED   CURRENT   READY     AGE
#mysql-3238461207   1         1         1         6m
docker ps
#CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              #PORTS               NAMES
#5252cd76009a        mysql:5.7                                                    "docker-entrypoint..."   55 minutes ago      Up 55 minutes                           #k8s_mysql.23f88726_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_6b15dcfc
#f026e79ddad9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           55 minutes ago      Up 55 minutes                           k8s_POD.1d520ba5_mysql-3238461207-vvwt8_default_72d7bff7-d81c-11e8-a729-000c29dabb02_668a091e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
注:都是1表示运行正常,特别是第一次拉取容器的镜像需要一段时间,所以Pod的状态一开始有可能是Pending,最终才变为Running。

#查看Pod里容器的时间,检查时间是否与本地时间一致
kubectl exec mysql-3238461207-vvwt8 date
#Thu Oct 25 15:06:15 CST 2020
1
2
3
注:exec后面跟pod的名称

定义一个Service文件
mysql-svc.yaml文件内容如下:

apiVersion: v1
kind: Service     #表示Kubernetes Service
metadata:
  name: mysql   #Service的名称
spec:
  ports:
    - port: 3306   #Service提供服务的端口号
  selector:
    app: mysql    #Service对应的Pod的标签
1
2
3
4
5
6
7
8
9
字段说明

kind:标明是Kubernetes Services
metadata.name:Service的全局唯一名称
spec.ports.port:Service提供服务的端口号
spec.selector:Service对应的Pod拥有这里定义的标签
发布Mysql SVC文件到集群中
kubectl create -f mysql-svc.yaml
#service "mysql" created
1
2
查询SVC文件信息
    Mysql服务被分配了一个值为10.254.209.200的虚拟IP地址(CLUSTER-IP),Kubernetes集群中创建的Pod就可以通过Services的10.254.209.200(Cluster IP)+ 3306(端口号)来链接和访问Cluster IP由Kubenrnetes自动分配,其他的Pod无法预先知道某个Services的Cluster IP地址Kubenrnetes利用Linux的环境变量(Environment Variable)来解决这个问题,Sevice的名字唯一,容器可以从环境变量中或i渠道Service对应的Cluster IP地址和端口,从而发起TCP/IP链接请求

kubectl get svc
#NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
#kubernetes   10.254.0.1       <none>        443/TCP          22h
#mysql        10.254.209.200   <none>        3306/TCP         7s
1
2
3
4
启动Tomcat应用
创建tomcat的Deployment定义文件
myweb-dep.yaml文件的内容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myweb
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        volumeMounts:
        - name: time-zone
          mountPath: /etc/localtime
        - name: tomcat-logs
          mountPath: /usr/local/tomcat/logs
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: '10.254.144.64'               #此处为mysql服务的Cluster IP,需要修改
        - name: MYSQL_SERVICE_PORT
          value: '3306'
      volumes:
      - name: time-zone
        hostPath:
          path: /etc/localtime
      - name: tomcat-logs
        hostPath:
          path: /data/tomcat/logs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
发布Tomcat deployment
kubectl create -f myweb-dep.yaml 
#deployment "myweb" created
1
2
注:创建过程比较久,请耐心等待,pod的STATUS状态为Running时表示创建成功。

定义一个Service文件
创建tomcat的Service定义文件,myweb-svc.yaml文件的内容如下:

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb
1
2
3
4
5
6
7
8
9
10
11
注:此Service开启了NodePort方式的外网访问模式,端口为30001,此端口会映射到tomcat容器的8080端口上。

发布Tomcat SVC文件到集群中
kubectl create -f myweb-svc.yaml 
#service "myweb" created
#查询Tomcat SVC信息
kubectl get svc
#NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
#kubernetes   10.254.0.1       <none>        443/TCP          23h
#mysql        10.254.209.200   <none>        3306/TCP         1h
#myweb        10.254.216.52    <nodes>       8080:30001/TCP   7s
#可使用curl命令测试tomcat服务是否能正常访问
 curl http://172.18.8.228:30001
1
2
3
4
5
6
7
8
9
10
通过浏览器访问网页
如果30001端口不通的话,重新启动、关闭firewalld防火墙
systemctl start firewalld
systemctl stop firewalld
1
2
注:因为kubernetes会在iptables里添加一些策略,需要再重新开启关闭防火墙才会关闭掉这些策略。

错误整理
在创建rc与pod时出现迟迟无发运行pods状态如下:
使用kubectl describe pods Pod_Name来查看是什么原因。其中遇到错误为:
kubectl describe pods mysql-ln2bl
#skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull 
#failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, 
#this may be because there are no credentials on this request. details: 
#(open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
1
2
3
4
5
解决方法:下载rpm包安装rhsm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
1
2
删除rc与pod
kubectl delete -f XXX.yaml 或者kubectl delete pods pod_name

详细使用方法查看 kubectl delete --help
重新创建之后便可已正常运行。
 
————————————————
版权声明:本文为CSDN博主「涛子丶白了你一眼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lctlinger/article/details/111473154

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值