首先准备Kubernets的环境,使用的是centos7.5
关闭防火墙:
# systemctl disable firewalld # systemctl stop firewalld
1、创建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日志的目录 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和容器,创建过程需要先下载镜像,时间会比较久。
查看Pod里容器的时间,检查时间是否与本地时间一致
# kubectl exec mysql-3238461207-vvwt8 date Thu Oct 25 15:06:15 CST 2018注:exec后面跟pod的名称
mysql-svc.yaml文件内容如下:
apiVersion: v1 kind: Service #表示Kubernetes Service metadata: name: mysql #Service的名称 spec: ports: - port: 3306 #Service提供服务的端口号 selector: app: mysql #Service对应的Pod的标签各个字段说明
kind:标明是Kubernetes Servicesmetadata.name:Service的全局唯一名称spec.ports.port:Service提供服务的端口号spec.selector:Service对应的Pod拥有这里定义的标签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创建tomcat的Service定义文件,myweb-svc.yaml文件的内容如下:
apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb注:此Service开启了NodePort方式的外网访问模式,端口为30001,此端口会映射到tomcat容器的8080端口上。1、如果30001端口不通的话,重新启动、关闭firewalld防火墙
# systemctl start firewalld # systemctl stop firewalld 注:因为kubernetes会在iptables里添加一些策略,需要再重新开启关闭防火墙才会关闭掉这些策略。2、通过浏览器访问http://192.168.77.146:30001/demo/点击“Add...”,添加一条记录并提交提交以后,数据就被写入mysql数据库里了。3、登陆mysql数据库验证
[root@andyxu-test ~]# docker exec -it 5252cd76009a /bin/bash root@mysql-3238461207-vvwt8:/# mysql -uroot -p123456 mysql> use HPE_APP mysql> select * from T_USERS;可以继续研究下这个例子,比如:
研究RS、Service等文件的格式。熟悉kubectl的子命令。手工停止某个Service对应的容器,观察有什么现象发生。修改Deployment文件,改变pod副本的数量,重新创建,观察结果。
在创建rc与pod时出现迟迟无发运行pods状态如下:
使用kubectl describe pods Pod_Name来查看是什么原因。其中遇到错误为:
# kubectl describe pods mysql-ln2blName: mysql-ln2blNamespace: defaultNode: 127.0.0.1/127.0.0.1Start Time: Sat, 24 Aug 2019 17:42:13 +0800Labels: app=mysqlStatus: PendingIP: Controllers: ReplicationController/mysqlContainers: mysql: Container ID: Image: mysql Image ID: Port: 3306/TCP State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Volume Mounts: <none> Environment Variables: MYSQL_ROOT_PASSWORD: 123456Conditions: Type Status Initialized True Ready False PodScheduled True No volumes.QoS Class: BestEffortTolerations: <none>Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 41m 41m 1 {default-scheduler } Normal Scheduled Successfully assigned mysql-ln2bl to 127.0.0.1 40m 22s 177 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
41m 9s 13 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, 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)"
大致意思就是:未能通过ErrImagePull为“POD”启动“StartContainer”:“对于registry.access.redhat.com/rhel7/pod-infrastructure:latest,图像拉出失败,这可能是因为此请求上没有证书
检查发现:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt这个目录中是一个软连接
发现实际上并没有这个文件
网上说是因为证书导致的, 然后下载一个 yum remove *rhsm* -y 就可以解决,但发现这个rhsm文件被调换了,下载后发现是空的,然后通过下面的方法解决。
解决方法:下载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删除rc与pod
kubectl delete -f XXX.yaml 或者kubectl delete pods pod_name详细使用方法查看 kubectl delete --help重新创建之后便可已正常运行。
转载于:https://www.cnblogs.com/shawhe/p/11405137.html
