编译

直接在linux上解压源码的tar,或git clone, 然后进入kubernetes目录下,执行make即可编译。

安装

1.8.4中apiserver端开启了较为严格的认证机制,并且https证书的生成和下发也做了统一的部署,所以建议使用kubeadm进行统一的安装。

kubeadm的步骤简单说只有三步

预备工作
  • 为了避免翻不了墙,我们先在master节点上运行起etcd,简单的运行方法可以直接将etcd的二进制文件放入/usr/local/bin中,执行
nohup /usr/local/bin/etcd >/dev/null 2>&1 &

; 即可后台启动etcd,默认监听127.0.0.1 的2379 和2380端口。

  • 编辑配置文件,配置文件主要要存一些初始化集群时要用的参数,比如如下的配置:
{
        "apiVersion":"kubeadm.k8s.io/v1alpha1",
        "kubernetesVersion":"v1.8.4",
        "imageRepository": "hub.c.163.com/monsterhy",//修改成我们自己的镜像仓库,省去翻墙
        "etcd":{
                "endpoints":[
                        "http://127.0.0.1:2379" //预先配置好etcd,否则kubeadm会从网上下载etcd镜像运行。
                ]
        },
        "apiserverExtraArgs":{ //此处给apiserver配置额外的启动参数,方便在master上执行kubectl
                "insecure-bind-address":"127.0.0.1",
                "insecure-port": "8080"
        }
}
址
  • 在master和node上均下载kubeadm.dev,kubectl.deb(它被kubeadm依赖),kubelet.deb 和kubernetes-cni.dev(它被kubelet依赖),将上述deb安装好,确认可以 service kubelet start 后,stop kubelet服务;

上述的deb可以从这里找到,该页面上列表中deb的filename,加上‘https://packages.cloud.google...’前缀,即可下载。需要翻墙

配置master
  • 在master机器上,执行
kubeadm init --config=***

,就能看到开始初始化master,我们可以提前将apiserver、controller-manager、scheduler的docker镜像拉下来(也可以用自己编译的二进制文件打包docker镜像)只要确保镜像tag满足上文配置文件中的镜像仓库即可,比较省时。

  • master初始化完毕时,kubeadm的输出日志中会有如下的内容:

[bootstraptoken] Using token: c53f64.4165718ebe6533a9这里的token是用于node上采用kubeadm注册用的。

  • 如果我们想要重新配置master,可以执行kubeadm reset 将已经配置好的master清空
配置node
  • node机器上,先为kubelet启动时需要的cni插件做预备工作,一般kubeadm初始化node时会自动将一些基础cni插件放到/opt/cni/bin/中,我们还需要在/opt/cni/net.d/中加入CNI配置文件,如:
{
    "cniVersion":"0.3.1",
    "type": "ptp",
    "name": "hynet"
}

上述是一个简易的cni插件配置,表示采用ptp插件。k8s创建pause容器时,kubelet会执行/opt/cni/bin/ptp 二进制文件。

  • 在node机器上,执行kubeadm join --token=$token $masterURL,就能看到node注册成功。
  • 如果我们要修改一些kubelet的启动参数,比如:我们看到kubectl get nodes 展示的node名是node的机器名,如果我们想改成node的IP,需要:先还原之前的kubeadm配置:kubeadm reset;master上将该node删除;再次配置cni插件; 修改node上的/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,该文件是kubelet这个service的配置文件,其初始内容如下,我们改动一下其中的$KUBELET_EXTRA_ARGS,给kubelet加上hostname-override参数:
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
#给kubelet配置额外的启动参数:hostname-override
Environment="KUBELET_EXTRA_ARGS=--hostname-override=10.173.32.21"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS

随后再次执行行kubeadm join --token=$token $masterURL,就能看到新的node注册成功。

  • 使用kubeadm初始化时,node上的kubelet必须以service的形式安装好,所以我们建议使用下载deb/rpm进行安装的方式,如果我们要使用自己改造的kubelet,在第一步安装完deb后,或者整体部署完毕后,再替换node上的kubelet二进制文件,然后service kubelet restart即可。