1. 系统环境
操作系统:
CentOS 7
KV存储系统,用于集群的共享配置和服务发现(类似ZooKeeper):
etcd 3.1.0
容器管理工具:
Kubernetes 1.5.2
应用容器引擎
Docker 1.12.6
网络规划工具,统一分配集群Docker容器的虚拟IP,并实现服务之间通信:
Flannel 0.7.0
服务器 | 服务 |
---|---|
master | apiserver, controller-manager, scheduler |
node | flannel, docker, kubelet, kube-proxy |
etcd | etcd |
2. 基本环境配置
- 设置hosts
192.168.89.133
master
192.168.89.133
etcd
192.168.89.134
node1
PS:由于在虚拟机上面部署,所以只启动两台服务器,并且etcd和master运行在同一个物理机器上 - 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
PS:第一个命令关闭防火墙,第二个命令使开机不启动防火墙(永久关闭) - 永久关闭SELinux
修改/etc/selinux/config
SELINUX=disabled
- 重启机器
reboot
3. 安装和配置etcd
3.1 安装etcd
yum install etcd -y
3.2 配置etcd
修改/etc/etcd/etcd.conf
中的部分属性 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379"
PS:其中etcd
表示etcd服务器主机名
3.3 运行etcd
systemctl start etcd
systemctl enable etcd
3.4 配置etcd内网信息
etcdctl -C 192.168.89.133:2379 set /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
PS:其中网络号172.17.0.0/16
与docker中的docker0网络一致(若不一致,可修改docker0网络或者配置上述etcd网络);atomic.io
与下面的Flannel配置中的FLANNEL_ETCD_PREFIX
对应
4.master服务器上安装服务
4.1 安装kubernetes-master
yum install kubernetes-master
4.2 配置apiserver
修改/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
PS:测试时需要把KUBE_ADMISSION_CONTROL
中的SecurityContextDeny
和ServiceAccount
去掉,这是权限相关的
4.3 配置全局配置文件
修改/etc/kubernetes/config
KUBE_MASTER="--master=http://master:8080"
4.4 设置开机启动并启动master服务
systemctl enable kube-apiserver kube-scheduler kube-controller-manager
systemctl start kube-apiserver kube-scheduler kube-controller-manager
4.5 测试master服务
访问http://master:8080会返回json描述信息,如下图:
5.node1工作节点上安装服务
5.1 安装docker
yum install docker
5.2 安装flannel
yum install flannel
5.3 配置flannel
修改/etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
PS:其中atomic.io
与上面etcd中的Network
对应
5.4 安装kubernetes-node
yum install kubernetes-node
5.5 配置全局配置文件
修改/etc/kubernetes/config
KUBE_MASTER="--master=http://master:8080"
5.6 配置kubelet组件
修改/etc/kubernetes/kubelet
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://master:8080"
5.7 配置开机启动并启动服务
systemctl enable kubelet kube-proxy
systemctl start kubelet kube-proxy
6.测试集群是否工作
在master节点运行 kubectl get nodes
若正常工作,可获取工作节点信息及运行状态为Ready,如下图:
7.发布nginx服务
7.1 创建pod : nginx-pod.yaml
kubectl create -f nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
7.2 查看pod的状态
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-pod 0/1 ContainerCreating 0 6s
等10分钟再试 NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 13m
PS:这里经常会因为网络问题失败,可以先使用docker手动pull镜像后再使用kubectl来create pod,如果还是不行,就delete pod之后再create pod,实在不行,可以重启机器试试,还是不行,那就是配置出问题了
7.3 创建replicationController : nginx-rc.yaml
kubectl create -f nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-rc
spec:
replicas: 1
selector:
name: nginx-pod
template:
metadata:
labels:
name: nginx-pod
spec:
containers:
- name: nginx-pod
image: nginx
ports:
- containerPort: 80
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
7.4 查看ReplicationController状况
7.5 创建service : nginx-service.yaml
kubectl create -f nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 80
nodePort: 30001
selector:
name: nginx-pod
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
7.6 查看service状态
PS:其中Kubernetes服务为Kube系统自带服务,无需理会
7.7 测试发布的nginx服务
使用其他机器的浏览器访问node1机器的30001端口
8. 相关文章
Kubernetes 1.5部署安装dashboard
Kubernetes中的nodePort,targetPort,port的区别和意义
9. 参考
西楼:https://my.oschina.net/zhougui/blog/824165
督门提酒的博客:
http://blog.youkuaiyun.com/u010884123/article/details/56485246?locationNum=10&fps=1
10. yaml源码
https://github.com/HeYongbiao/kube_nginx
11. 学习资料
kubernetes指南:http://pan.baidu.com/s/1gfKHDAF 密码:who6
etcdctl cluster-health 查看健康状态
etcdctl member list 查看etcd集群列表
kubectl describe pods nginx-pod 查看pods日志
遇到的问题
用k8s创建完pod后,发现无法访问demo应用,查了一下pods状态,发现都在containercreationg状态中。
百度了一下,根据网上的方法,查了一下mysql-jn6f2这个pods的详情
其中最主要的问题是: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,所以需要使用yum安装:
yum install *rhsm*
安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果依然报错,可参考下面的方案:
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
这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件.
顺得的话会得到下面的结果。
[root@localhost]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...
latest: Pulling from registry.access.redhat.com/rhel7/pod-infrastructure
26e5ed6899db: Pull complete
66dbe984a319: Pull complete
9138e7863e08: Pull complete
Digest: sha256:92d43c37297da3ab187fc2b9e9ebfb243c1110d446c783ae1b989088495db931
Status: Downloaded newer image for registry.access.redhat.com/rhel7/pod-infrastructure:latest
删除原来创建的rc
[root@localhost /]# kubectl delete -f mysql-rc.yaml
重新创建
[root@localhost /]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
再次查看状态
[root@localhost /]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-b8m2q 1/1 Running 0 27m