上一篇已经介绍过 docker 的单机安装, 然后单机安装 1 是没有高可用, 2 是每次上去手工创建 docker 实例, 建多了之后都不记得哪个打哪个, 管理不方便.
于是又诞生了各种专门为了管理 docker 的创建, 调度, 销毁的平台, 其中 kerbernetes 是比较主流的解决方案.(简称 k8s)
实验环境:
操作系统: CentOS7
kerbernetes 集群: 实验中 kerbernetes 管理节点是单机部署, 没有按照集群部署
节点 | IP 地址 |
master | 10.1.30.34 |
etcd | 10.1.30.34 |
镜像仓库 | 10.1.30.34:5000 |
node01 | 10.1.30.35 |
node02 | 10.1.30.36 |
1, 环境准备:
1.1 关闭防火墙
- systemctl stop firewalld
- systemctl disable firewalld
1.2 关闭 selinux
- setenforce 0
- vi /etc/selinux/config
- SELINUX=disabled
1.3 配置 yum 源与安装扩展 yum
使用阿里云的 yum 源, 配置略, 参考 [实践演练] Linux 操作系统 04 - 配置 yum 源 https://blog.51cto.com/14423403/2416049
1.4 修改 hostname
修改 hostname
- vi /etc/hostname
- # 每台修改为自己对应的名字;
10.1.30.34 输入 master
10.1.30.35 输入 node01
10.1.30.36 输入 node02
另外需要输入 hostname 直接修改 hostname, 然后重启机器生效
1.5 修改 hosts 表
3 台都需要修改
- vi /etc/hosts
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain
- 10.1.30.34 master
- 10.1.30.34 etcd
- 10.1.30.35 node01
- 10.1.30.36 node02
1.6 配置免密登录
- SSH-keygen
- // 一路回车默认即可
SSH-copy-id {其他机器的 ip}
远程其他机器的时候, 提示 Are you sure you want to continue connecting (yes/no)?
按 yes 继续, 然后提示输入目标主机的密码.
然后 SSH 其他机器 IP 测试, 如果没有提示输入密码即可远程登录, 操作完成.
2,Master 安装:
以下 2.X 内容, 只需要在 Master(10.1.30.34 节点安装),Node 不需要.
2.1 安装 etcd 服务
yum install etcd -y
配置 etcd
- vi /etc/etcd/etcd.conf
- ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://10.1.30.34:2379"
- ETCD_ADVERTISE_CLIENT_URLS="http://10.1.30.34:2379"
运行 etcd
- systemctl start etcd
- systemctl enable etcd
配置 etcd 内网信息
- etcdctl set /k8s/network/config '{"Network":"173.16.0.0/16"}'
- # 此网段用于后续通过 YAML 创建 docker 实例时, 给多个 pod 组成的 Service Cluster 分配 IP 地址使用. 并且配置需要与后面 flannel 保持一致, 才能正常与 node 通信给分配地址.
- # 注意 173.16.0.0/16 这个可以随便改, 但是要用 16 位的, 24 位的会有问题.
2.2 安装 kurbernets master
yum install kubernetes-master -y
配置 API Server
- vi /etc/kubernetes/apiserver
- KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
- KUBE_ETCD_SERVERS="--etcd-servers=http://10.1.30.34:2379"
- KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=173.16.0.0/16"
- KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
- # 注意需要去掉 KUBE_ADMISSION_CONTROL 默认的中的 SecurityContextDeny 和 ServiceAccount, 与权限配置相关, 实验不需要.
- #--service-cluster-ip-range 需要与 etcd 设置的内网网段一致
配置全局文件
- vi /etc/kubernetes/config
- KUBE_MASTER="--master=http://10.1.30.34:8080"
启动服务, 并且服务设置开机启动
- systemctl enable kube-apiserver kube-scheduler kube-controller-manager
- systemctl restart kube-apiserver kube-scheduler kube-controller-manager
验证测试:
网页访问 http://10.1.30.34:8080/, 有返回则正常.
3,Node 安装:
以下 3.X 内容, 除非特殊说明, 否则仅需在 Node 节点安装, Master 无需安装.
3.1 安装 docker(master,node 都需要安装)
- yum install docker -y
- systemctl start docker
拉取小镜像测试
docker run busybox echo "Hello world"
3.2 安装 flannel(master,node 都需要安装)
- #flannel 用于 kurbernets master 与 node,node 与 node 之间的内部通信, kurbernets 本身不提供该项功能, 同类的还有 calico, 需要额外安装.
- yum install flannel -y
配置 flannel
- vi /etc/sysconfig/flanneld
- FLANNEL_ETCD_ENDPOINTS="http://10.1.30.34:2379"
- FLANNEL_ETCD_PREFIX="/k8s/network"
- # 注意 / k8s/network 与之前 etcd 配置保持一致
3.3 安装 kubernetes node
yum install kubernetes-node -y
编辑全局配置文件
- vi /etc/kubernetes/config
- KUBE_MASTER="--master=http://10.1.30.34:8080"
编辑 kubelet 组件
- # 此组件很重要, 配置错误 YAML 经常无法正常创建 docker
- vi /etc/kubernetes/kubelet
- KUBELET_ADDRESS="--address=0.0.0.0"
- # 对所有接口开放, 使 master 能够登录 node 查看 pod 信息; 该参数默认为 127.0.0.1
- KUBELET_PORT="--port=10250"
- KUBELET_HOSTNAME="--hostname-override=node01"
- #node01,02 按实际修改
- KUBELET_API_SERVER="--api-servers=http://10.1.30.34:8080"
- # pod infrastructure container
- KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
- # 修改根镜像下载地址, 默认为 registry.access.RedHat.com/rhel7/pod-infrastructure:latest,YAML 后面创建 docker,kubectl get pod 后面, pod 一直卡在 ContainerCreating 不变为 running, 会有个报错. 也可以修改为私有镜像仓库, 参见 "下一篇 k8s 私有镜像仓库的搭建", 可以修改为 registry:5000/ pod-infrastructure:latest", 那么所有镜像就能从 registry 那边 pull 与 push 了.
- # Add your own!
- KUBELET_ARGS="--cluster_dns=173.16.0.100 --cluster_domain=cluster.local"
- #添加 DNS 配置项, 173.16.0.100 的地址, 在 etcd 配置的网段里面, 随便选择一个 IP 地址都可以, 注意一定要是 etcd 配置的地址段.
修改 dns 解析配置 (注意只有这一步 master 也需要修改)
vi /etc/resolv.conf
将内部信息改为 (追加)
- search default.svc.cluster.local svc.cluster.local cluster.local
- nameserver 173.16.0.100
启动服务与设置开机启动
- systemctl enable kubelet kube-proxy
- systemctl restart kubelet kube-proxy
每次修改配置后的配置重载与服务重启 (必须 daemon-reload 重载, 修改才生效)
- systemctl daemon-reload
- systemctl restart kubelet kube-proxy
Node 整体服务开启
- systemctl restart flanneld
- systemctl daemon-reload
- systemctl restart docker
- systemctl restart kubelet kube-proxy
- iptables -P FORWARD ACCEPT
- # 不加 node 与 master 的通信会有问题
4, 创建实例:
在 master 运行
kubectl get node
返回节点 ready, 表示节点已正常.
kubectl get pod 表示 no resource, 表示还未有创建实例.
在 master 上配置 rc 的 YAML 文件与 svc 的 YAML 文件, 用于在 node 创建 docker 实例. 使用 tomcat 进行测试.
- vi myweb-rc.YAML
- apiVersion: v1
- kind: ReplicationController
- metadata:
- name: myweb
- spec:
- replicas: 2
- selector:
- App: myweb
- template:
- metadata:
- labels:
- App: myweb
- spec:
- containers:
- - name: myweb
- image: tomcat
- ports:
- - containerPort: 8080
- env:
- - name: MYSQL_SERVICE_HOST
- value: 'mysql'
- - name: MYSQL_SERVICE_PORT
- value: '3306'
- # 其中 replicas: 2 表示 2 个 pod, 相当于 2 个副本.
image: tomcat, 这里可以修改不同的镜像源 / tomcat, 注意本篇文章的各种配置参数, 适用于直接写 image: tomcat, 不要加其他前缀.
后面说完如何创建私有仓库后, 改为 image: registry:5000/tomcat, 但是需要先创建私有镜像仓库.
编辑 svc 文件
- vi myweb-svc.YAML
- apiVersion: v1
- kind: Service
- metadata:
- name: myweb
- spec:
- type: NodePort
- ports:
- - port: 8080
- name: myweb-svc
- nodePort: 30001
- selector:
- App: myweb
创建 pod 与 svc
- kubectl create -f myweb-rc.YAML
- kubectl create -f myweb-svc.YAML
- # 删除可以将 create 改为 delete
查看结果
- kubectl get pod
- kubectl get svc
测试 docker 实例是否可用
可以直接访问 node:30001 端口进行测试, 看是否正常返回 tomcat 页面.
如 10.1.30.35:30001
5, 排错:
如果发现 pod 一直卡在 ContainerCreating, 没有变为 running
到 node 上面运行如下命令查看日志
journalctl -u kubelet -f
发现报错
- ErrImagePull; Skipping pod "myweb-d73gs_default(b120badd-9df6-11e9-92af-0050569ba5d7)":
- 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
发现各个 node 节点无法从红帽源 pull 取 dokcer 镜像.
解决方法:(每个 node 节点都需要, Master 不需要)
yum install *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
然后执行
docker pull registry.access.RedHat.com/rhel7/pod-infrastructure:latest
回到 master, 删除 myweb-rc, 重新创建 myweb-rc
- kubectl delete -f myweb-rc.YAML
- kubectl create -f myweb-rc.YAML
等待一会儿, 重新 kubectl get pod
- NAME READY STATUS RESTARTS AGE
- myweb-j916d 1/1 Running 0 47m
- myweb-m962p 1/1 Running 0 47m
pod 正常运行, 变为 running 状态.
- kubectl get svc
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes 173.16.0.1 <none> 443/TCP 6h
- myweb 173.16.133.17 <nodes> 8080:30001/TCP 5h
重新访问 10.1.30.35:30001 测试.
来源: http://blog.51cto.com/14423403/2416702