加快Kubernetes编译速度

除了linux/amd64,默认还会为其他平台做交叉编译。为了减少编译时间,可以修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS, KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64以外的其他平台注释掉

gcr.io无法访问

Kubernetes在创建Pod的时候,需要从gcr.io下载一个helper镜像(目前是 gcr.io/google_containers/pause-amd64:3.0 )。
但是目前国内无法访问gcr.io,这个问题会导致无法下载该镜像,然后Pod一直处于ContainerCreating状态。

解决办法

1) 在可以访问gcr.io的地方

docker pull gcr.io/google_containers/pause-amd64:3.0

传到私有docker registry

docker tag gcr.io/google_containers/pause-amd64:3.0 k8s-docker.mydomain.com/google_containers/pause-amd64:3.0

docker push k8s-docker.mydomain.com/google_containers/pause-amd64:3.0

2) 在所有的k8s节点

docker pull k8s-docker.mydomain.com/google_containers/pause-amd64:3.0
docker tag k8s-docker.mydomain.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

Note

不通过私有registry中转,而是使用docker save/load应该也可以(未测试),只是比较麻烦。

从集群外访问Service和Pod

这里说的集群外是指K8s集群以外的主机,比如使用nginx/HAProxy搭建的负载均衡主机。这些主机跟K8s集群部署在一起,到K8s网络可达。
对于不是部署在GCE以及AWS等云平台的K8s,我们一般需要自己搭建负载均衡,然后分发请求到到Service。
使用NodePort方式发布服务,那么负载均衡主机上不需要额外配置;使用ClusterIP方式,为了能够访问Service的ClusterIP, 需要在这些主机上安装Flanneld和kube-proxy


坑1:

IPV4 forwording报错,但是容器运行正常。

[root@registry mnt]# docker run -d -p 5000:5000 -v /mnt/date/registry registry

WARNING: IPv4 forwarding is disabled. Networking will not work.

970e18480c47661fd2cffab9f7e0410989e62ed9d229333cb32e5727a2e88b3b

 

解决方案:

在/etc/sysctl.conf文件中加入net.ipv4.ip_forward=1并重启网络服务。


修改后正常:

[root@registry mnt]# docker run -d -p 5000:5000 -v /mnt/date/registry registry

abbec57e5dca734689cfd953f27564156ec24e32ae6e532043309f0332653650

[root@registry mnt]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

abbec57e5dca        registry            "/entrypoint.sh /etc/"   31 seconds ago      Up 30 seconds       0.0.0.0:5000->5000/tcp   compassionate_mclean


坑2:

查看镜像存放位置显示404 page not found网上很多教程都是下面这个命令

[root@docker01 ~]# curl http://10.100.50.122:5000/v2/search

404 page not found

通过docker search registry发现安装的是2.0版本

[root@etcd registry]# docker search docker-registry

INDEX      NAME          DESCRIPTION                         STARS     OFFICIAL   AUTOMATED

docker.io docker.io/alpine    A minimal Docker image based on Alpine Lin...   3733      [OK]       

docker.io docker.io/registry  The Docker Registry 2.0 implementation for...    2031      [OK]   

V2的命令格式如下:

[root@docker01 ~]# curl http://10.100.50.122:5000/v2/_catalog

{"repositories":["busybox","centos"]}


坑3:

[root@k8s-master demo]# docker pull 10.0.0.10:5000/busybox

Using default tag: latest

Trying to pull repository 10.0.0.10:5000/busybox ... 

Get https://10.0.0.10:5000/v1/_ping: http: server gave HTTP response to HTTPS client


[root@k8s-master demo]# vi /etc/sysconfig/docker

需要检查客户端

OPTIONS='--selinux-enabled --insecure-registry 10.0.0.10:5000'



坑4:

[root@k8s-master demo]# cat /etc/kubernetes/kubelet

###

# kubernetes kubelet (minion) config


# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)

KUBELET_ADDRESS="--address=127.0.0.1"


# The port for the info server to serve on

# KUBELET_PORT="--port=10250"


# You may leave this blank to use the actual hostname

KUBELET_HOSTNAME="--hostname-override=127.0.0.1"


# location of the api-server

KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"


# pod infrastructure container

#KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=kube-registry:5000"


# Add your own!

KUBELET_ARGS=""


KUBELET_POD_INFRA_CONTAINER

Pod 启动时的一个基础容器,你可以通过Dokcer ps -a命令看到这个容器,类似windows系统服务,供kubenetes内部使用。


这个是一个基础容器,每一个Pod启动的时候都会启动一个这样的容器。如果你的本地没有这个镜像,kubelet会连接外网把这个镜像下载下来。最开始的时候是在Google的registry上,因此国内因为GFW都下载不了导致Pod运行不起来。现在每个版本的Kubernetes都把这个镜像打包,你可以提前传到自己的registry上,然后再用这个参数指定。


[root@k8s-master demo]# kubectl get pod

NAME      READY     STATUS         RESTARTS   AGE

busybox   0/1       ContainerCreating   0          36m


这是导致STATUS的状态始终无法running的根本原因