参考文章:
https://www.cnblogs.com/guyeshanrenshiwoshifu/p/9147238.html
https://blog.csdn.net/qq_34701586/article/details/78732470
http://ju.outofmemory.cn/entry/363031
首先需要有一台centos7的虚拟机(我是使用virtualbox5创建的)。
打开虚拟机命令行,执行以下命令。
1. 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2. 安装kubernetes(etcd也需要装,用来保存集群状态)
yum install -y etcd kubernetes
3. 修改docker配置文件:vi /etc/sysconfig/docker
原始形式:
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
修改后:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
4. 修改配置文件/etc/kubernetes/apiserver:
修改KUBE_ADMISSION_CONTROL的内容为(删除ServiceAccount):
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
注:我不知道第3、4步有什么用。。。但网上都是这么写的。
5. 启动服务
start:
systemctl start etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
restart:
systemctl restart etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
6. 服务启动后
启动后,发现node已经ready了。
部署一个应用:
kubectl run my-nginx --image=nginx --replicas=2 --port=80
此时发现如下情况:应用根本没有启动。
查看其中一个pod的描述信息(根据自己的情况填相应的name)
kubectl describe pod my-nginx-379829228-6bkzb
在信息的最后面有如下描述:
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)"
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
主要两句就是:image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest
open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory
接下来解决该问题。
首先查看缺失的文件redhat-ca.crt:
发现它是一个链接文件,查看它所链接的文件,发现没有该文件。
该链接文件,需要安装python-rhsm-certificates。但是安装时会出现如下状况:
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.21.10-3.el7.centos.x86_64 取代
无须任何处理
没办法,需要先删除掉subscription-manager-rhsm-certificates
yum remove subscription-manager-rhsm-certificates
你会发现,顺便删除了一些依赖项,所以过会儿还要把他们补回来。
删除:
subscription-manager-rhsm-certificates.x86_64 0:1.21.10-3.el7.centos
作为依赖被删除:
docker.x86_64 2:1.13.1-94.gitb2f74b2.el7.centos kubernetes.x86_64 0:1.5.2-0.7.git269f928.el7 kubernetes-node.x86_64 0:1.5.2-0.7.git269f928.el7
接下来安装python-rhsm-certificates,还是会出现问题(下面这条指令别执行!)。
yum install python-rhsm-certificates
你会发现安装的不是python-rhsm-certificates,而是subscription-manager-rhsm-certificates。
[root@master ~]# yum install python-rhsm-certificates
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.cuhk.edu.hk
* extras: ftp.cuhk.edu.hk
* updates: ftp.cuhk.edu.hk
软件包 python-rhsm-certificates 已经被 subscription-manager-rhsm-certificates 取代,改为尝试安装 subscription-manager-rhsm-certificates-1.21.10-3.el7.centos.x86_64
正在解决依赖关系
--> 正在检查事务
---> 软件包 subscription-manager-rhsm-certificates.x86_64.0.1.21.10-3.el7.centos 将被 安装
--> 解决依赖关系完成
xxx
已安装:
subscription-manager-rhsm-certificates.x86_64 0:1.21.10-3.el7.centos
完毕!
所以不能使用yum来安装python-rhsm-certificates,需要使用rpm来安装。
先查看版本号
yum list available |grep python-rhsm-certificates
然后在该网站(http://mirror.centos.org/centos/7/os/x86_64/Packages/)下载对应版本的文件到当前目录:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
当文件下载到当前目录后,安装:
rpm -ivh python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
安装完成之后,查看之前的链接文件,发现现在存在了。
接下来需要备份该文件(因为你重新安装subscription-manager-rhsm-certificates后,该文件又会不见了)。
备份完成后,重新安装之间被remove掉的软件,为了方便,直接执行以下命令:
yum install kubernetes
执行时,你会发现subscription-manager-rhsm-certificates把你手动安装的python-rhsm-certificates给替换掉了。
安装完成后,会发现/etc/rhsm/ca目录下的文件不见了(这就是要备份的原因)。
注:说好的备份,我没备份。。。。又要删除,重新来一遍。
将备份redhat-uep.pem复制到/etc/rhsm/ca目录下:
cp redhat-uep.pem /etc/rhsm/ca/
此时问题基本已经解决了。重启所以服务:
systemctl restart etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
然后等一会儿,node才会ready:
也要等一会儿,pod才会running:
问题解决!!