liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

Docker和Kubernetes (k8s)学习-将kubernetes权威指南中的示例跑起来 #134

Open liujiusheng opened 5 years ago

liujiusheng commented 5 years ago

本文章主要是帮助初学者将《Kubernetes权威指南-第二版》中的示例跑起来。

Docker目前已经可以运行于Linux,Windows,MacOS系统。 Win10的企业版和专业版可以直接在“Windows功能”里面勾选Hyper-V打开Windows版本的Docker。 也可以使用boot2docker或者Docker for Windows工具来安装。

docker现在已经更名为了moby

k8s是谷歌出品的一个开源集群管理工具

k8s中执行kubectl get pods 时若状态为Terminating,表示pod正在被删除,Normal,Pulling,Pulled,Created,Started表示正在启动。Running表示镜像拉取成功并且启动成功。

可使用kubectl delete pod PODNAME --force --grace-period=0命令强制删除pod。

所有k8s里面用到了的镜像都需要自己先手动docker pull mysql一下,拉到本地。

关闭防火墙:

systemctl disable firewalld
systemctl stop firewalld

k8s启动命令:

systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy

关闭命令:

systemctl stop etcd
systemctl stop docker
systemctl stop kube-apiserver
systemctl stop kube-controller-manager
systemctl stop kube-scheduler
systemctl stop kubelet
systemctl stop kube-proxy

docker login hub.docker.com命令可登录仓库

启动服务命令:

kubectl create -f mysql-rc.yaml
kubectl create -f mysql-svc.yaml
kubectl create -f myweb-rc.yaml
kubectl create -f myweb-svc.yaml

关闭服务:

kubectl delete -f mysql-rc.yaml
kubectl delete -f mysql-svc.yaml
kubectl delete -f myweb-rc.yaml
kubectl delete -f myweb-svc.yaml

重新加载docker配置:

systemctl daemon-reload
systemctl restart  docker

先后会遇到

1.ca.crt证书的问题(一定会出现)

下载相关包,手动生成crt文件 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

2.dns问题(不一定出现):

修改/etc/kubernetes/kubelet文件中KUBELET_ARGS为:KUBELET_ARGS="--cluster-dns=10.10.0.10 --cluster-domain=cluster.local"

3.拉不下来仓库数据的问题(一定会出现)

最好是能注册一个阿里云的账号用上面的镜像,不然真的会慢成狗 https://cr.console.aliyun.com/cn-hangzhou/mirrors

--registry-mirror=https://ka7kmrnv.mirror.aliyuncs.com

image

kubeguide/tomcat-app:v1,这个版本号一定是需要的,不然会提示not found.找不到也就是说网络实际上已经通了,但是找不到这个库,所以需要上hub.docker.com上去仔细核对是不是名字写错了或者版本号写错了。

基础容器镜像需要配置成默认的红帽那一个,即: KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" 其它的都不能成功,至于要不要把翻墙开上不太清楚,好像是不需要的,因为配置了mirror-registries为阿里云的地址的。

新版本的docker配置有两个地方,即:containers/registries.conf和,docker/daemon.json registries.conf在search里面最好也加上阿里云的镜像:ka7kmrnv.mirror.aliyuncs.com,因为我怀疑daemon.json文件并没有生效,当然啦,按照阿里云官方的说法,配置在daemon.json文件里是可以镜像加速的。

书上说的需要配置/etc/sysconfig/docker文件中:--insecure-registry gcr.io,这一名其实可以不用配置,如果配置了上述docker两个配置文件的话。

以上解决方法还待验证。

书上说的需要配置/etc/sysconfig/docker文件中:--insecure-registry。这一个代表私有仓库地址,当我们只用公有仓库的镜像时是可以不用配置它的,如果要配置就使用国内镜像,不要使用书上写的gcr.io。而且新版本推荐的配置地方已经是daemon.json文件里面了。

/etc/docker/daemon.json中需要配置阿里云的源。然后新加载配置和重启docker. centos7需要将docker.service复制到另一个目录

sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service 并且在ExecStart部分加上参数--registry-mirror=<我的阿里云镜像地址>

有个疑问,既然这里这样配置了,那

systemctl daemon-reload
 systemctl restart  docker

/etc/kubernetes/apiserver文件中ServiceAccount如果不删除,那么get pods的时候会返回no resource found.

由于电脑上的虚拟机不会使用主机上的代理,所以即使外部的主机上安装了蓝灯等代理软件也并不能解决虚拟机里不能翻墙的问题。 解决虚拟机里docker没法拉镜像下来的另一个办法是,在宿主机上打开蓝灯,然后在虚拟机里执行:export https_proxy=https:192.168.0.101:51745将虚拟机的https请求用外部的代理进行代理,然后运行sudo docker run nginx就可以正常下载镜像了

在命令行使用--registry-mirror=https://ka7kmrnv.mirror.aliyuncs.com的方式已经不被支持了 阿里云镜像的方式亲测是可以成功的

4.外部宿主机上访问不到虚拟机里tomcat的问题(已经没用了)

先关闭防火墙, systemctl disable firewalld systemctl stop firewalld 再 iptables -P FORWARD ACCEPT一行命令搞定

期间可能需要切换虚拟机模式,NAT模式与桥接模式的转换,桥接模式需要配置: BOOTPROTO="static" IPADDR=172.16.2.128 GATEWAY=192.16.2.1 NETMASK=255.255.255.0

后经反复实验表明,NAT模式下不需要配置为静态ip宿主机也是可以访问虚拟机里的内容的。

5.机器本地curl都访问不到的问题

需要先启动rc再启动svc.如果不启动svc访问会报Connection refused错误,curl也访问不到

kubectl describe pod mysql可以查看mysql这一个pod的日志。

安装netstat 工具:yum -y install net-tools

查看2379端口绑定的Ip是多少:netstat -anp | grep 2379

测试ip和端口是否通了:telnet 192.168.64.133 2379 telnet测试时只有目标服务器有在这个Ip上绑定端口才会有返回值 ,否则只会提示Connection refused

centos7上即使防火墙关闭了外面也不一定能访问到,还需要把防火墙打开后显式配置相应的端口后再关闭防火墙。

开启防火墙:systemctl start firewalld 开机启动防火墙:systemctl enable firewalld 添加8080端口:firewall-cmd --zone=public --add-port=8080/tcp --permanent 重新加载配置:firewall-cmd --reload 关闭防火墙:systemctl stop firewalld 开机不启动防火墙:systemctl disable firewalld 查看已配置的端口:firewall-cmd --list-ports 查看所有已允许通过的服务:firewall-cmd --get-services,默认只通过ssh dhcpv6-client。需要手动加入http。 查看开放的端口和服务:firewall-cmd --list-all

etcd作为k8s运行的数据中心,它的配置文件为/etc/etcd/etcd.conf,实际使用过程中需要在此文件内绑定ip。否则其它节点无法连接。ETCD_LISTEN_CLIENT_URLS和ETCD_ADVERTISE_CLIENT_URLS都要修改。

测试的时候/etc/kubernetes/apiserver内的--insecure-bind-address=0.0.0.0要设置为任意机器都可以连接,否则其它节点连接不到,从而加入不了集群。

flannel作为其网络统一性保障的基础设施,需要安装。可使用yum安装 。 安装完成后需要修改:/etc/sysconfig/flanneld文件,并将FLANNEL_ETCD_ENDPOINTS设置为etcd所绑定的ip。 修改完后重新加载配置并重新启动flannel和docker,此时ip addr命令查看时会发现flanneld和docker在同一网段。

/etc/kubernetes/kubelet中:--hostname-override表示本机的名字,通常应该配置成本机ip地址,若多台机器用了同一个名字,能注册成功,但master节点调度会出问题。

KUBELET_ADDRESS="--address=0.0.0.0"可以设置为0.0.0.0也可以设置为127.0.0.1,影响不大。

查看实时输出的错误:journalctl -f -u kubelet

Docker

是虚拟化的一个软件环境,包括操作系统等,而不仅仅是虚拟化的一个软件。

首先 删除 容器,再删除镜像

docker ps -a docker rm id 删除镜像

docker ps -a

docker images

docker rmi id

检查是否删除成功

docker images

docker启动的时候要映射端口,如: docker run --name mynginx -p 30001:80 -d nginx 表示运行nginx的镜像,并命名为mynginx 其中,nginx内部的80端口映射为外部的30001端口,外部可通过30001端口进行访问。

docker镜像的复制(内网部署):

sudo docker save -o golang:alpine3.7  ./my-golang-alpine3.7.tar //把我本机的golang:alpine3.7 镜像保存为当前目录下的归档文件my-golang-alpine3.7.tar ,然后把此归纳文件拷贝到任意你想要的地方(比如 u盘 移动硬盘 电脑等)

在需要还原docker image的主机执行:sudo docker load < my-golang-alpine3.7.tar (宿主机必须装有docker)

其它参考:

K8s官网 解决crt问题,使用这个的时候一定不能使用自己配置的dns,否则会找不到源。问题详见:dns导致下载出错的问题 防火墙问题