原文:http://blog.51cto.com/12730062/2059091
最近看了一下Kubernetes权威指南第二版,拿一个小例子来练习一下,主要熟悉一下yaml文件的语法格式。
一、关闭CentOS防火墙服务
[root@k8s ~]# systemctl disable firewalld
[root@k8s ~]# systemctl stop firewalld
二、安装etcd和Kubernetes软件
[root@k8s ~]# yum -y install etcd kubernetes
三、修改/etc/sysconfig/docker配置文件
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
四、修改/etc/kubernetes/apiserver配置文件
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
五、启动所有服务
[root@k8s ~]# systemctl start etcd
[root@k8s ~]# systemctl start docker
[root@k8s ~]# systemctl start kube-apiserver
[root@k8s ~]# systemctl start kube-controller-manager
[root@k8s ~]# systemctl start kube-scheduler
[root@k8s ~]# systemctl start kubelet
[root@k8s ~]# systemctl start kube-proxy
六、创建mysql-rc.yaml文件(RC)
apiVersion: v1
kind: ReplicationController #定义资源类型,代表这是一个副本控制器RC
metadata:
name: mysql #RC的名称,全局唯一
spec:
replicas: 1 #Pod副本期待数
selector:
app: mysql #Pod标签选择器,即监控和管理拥有这些标签的Pod实例
template: #根据此模板创建Pod副本
metadata:
labels:
app: mysql #Pod副本拥有的标签,对应RC的Selector
spec:
containers: #Pod内容器的定义部分
- name: mysql #容器的名称
image: mysql #容器对应的镜像
ports:- containerPort: 3306 #容器暴露的端口号
env: #注入到容器内的环境变量 - name: MYSQL_ROOT_PASSWORD
value: "123456"
- containerPort: 3306 #容器暴露的端口号
七、创建RC
[root@k8s ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
[root@k8s ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 0 6s
八、查看Pod的创建情况
[root@k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-hn49k 0/1 ContainerCreating 0 1m
注意:此处状态一直是"ContainerCreating",怎么办?我们查看一下pod的详细信息
[root@k8s ~]# kubectl describe pod mysql-hn49k
......
failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
17m 10s 7 {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)"
查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt路径发现是一个链接文件,但是我本地没有/etc/rhsm/ca/redhat-uep.pem怎么办?下载一个试试
[root@k8s ~]# yum -y install rhsm
yum了一个rhsm后还不好使,这个错误真蛋疼,找百度吧。。。。看到一个博客,才意识到pod的是依赖pause根容器的,但是这个镜像的网站是国外的,需要VPN,太麻烦。那就使用一点简单的办法
[root@k8s ~]# docker pull docker.io/kubernetes/pause
[root@k8s ~]# docker tag docker.io/kubernetes/pause gcr.io/google_containers/pause-amd64:3.0
[root@k8s ~]# docker rmi -f docker.io/kubernetes/pause
接下来是激动的时刻,删除掉刚才由mysql-rc.yaml文件创建出来的pod后再重新创建
[root@k8s ~]# kubectl delete -f mysql-rc.yaml
[root@k8s ~]# kubectl create -f mysql-rc.yaml
查看一下
[root@k8s ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 5h
[root@k8s ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-fjbt0 1/1 Running 1 5h
没有问题,那就继续往下。。。。
九、定义一个与之关联的service文件(mysql-svc.yaml)
apiVersion: v1
kind: Service #声明这是一个Kubernetes service类型的文件
metadata:
name: mysql #Service的全局名称
spec:
ports:
- port: 3306 #Service提供的端口号,虚端口
selector: #哪些pod副本对应到本服务
app: mysql
[root@k8s ~]# kubectl create -f mysql-svc.yaml
service "mysql" created
[root@k8s ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql 10.254.69.219 <none> 3306/TCP 9s
十、定义tomcat服务的RC文件(myweb-rc.yaml)
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5
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
[root@k8s ~]# kubectl create -f myweb-rc.yaml
[root@k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-fjbt0 1/1 Running 1 5h
myweb-cr3r3 1/1 Running 1 5h
myweb-hnsxq 1/1 Running 1 5h
myweb-l4g38 1/1 Running 1 5h
myweb-l4lc2 1/1 Running 1 5h
myweb-q5nts 1/1 Running 1 5h
- containerPort: 8080
创建Service文件(myweb-svc.yaml)
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort #表示此Service开启NodePort方式的外网访问模式
ports:
- port: 8080
nodePort: 30001 #集群之外可以通过30001端口访问myweb,对应到8080虚端口上
selector:
app: myweb
[root@k8s ~]# kubectl create -f myweb-svc.yaml
service "myweb" created
[root@k8s ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 6h
mysql 10.254.69.219 <none> 3306/TCP 9m
myweb 10.254.119.110 <nodes> 8080:30001/TCP 36s
至此,这个小程序就搭建完成了,我们可以通过curl测试一下
[root@k8s ~]# curl -I http://127.0.0.1:30001
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 09 Jan 2018 08:33:02 GMT
因为也是自己在研究琢磨,有需要修改的地方大家多指出来,谢谢各位!!!