kubeadm init
用于启动kubernetes master node。
kubeadm的初始化流程包括:
pre-flight check验证系统状态,在检验过程中提示warning或error。如果出现错误,则需要改正,或者使用
--skip-preflight-checks
生成自签名CA,为cluster的每个组件创建id。如果用户提供CA证书,或者使用配置证书目录
--cert-dir
,默认是/etc/kubernetes/pki
,则可以跳过该步骤。在
/etc/kubernetes/
目录为kubelet设置配置文件,controller-manager与scheduler与API Server需要以此通信kubeadm如果通过
--feature-gates=DynamicKubeletConfig
触发,则会将kubelet初始化文件写入/var/lib/kubelet/config/init/kubelet
。为API Server,Controller manager和scheduler生成静态Pod manifests。静态Pod清单文件将写入
/etc/kubernetes/manifests
,当启动时kubelet会监控该目录。如果kubeadm通过
--feature-gates=DynamicKubeletConfig
启动,在创建ConfigMap和RBAC规则时会完成kubelet自动配置,并通过关联Node.spec.configSource
与新创建的ConfigureMap,而更新Node。在Master node应用labels和taints,这样就不会有额外的workload在此运行
生成token,这样额外的nodes可以在master注册。
完成node与Bootstrap tokens和TLS Bootstrap关联的配置
- 为所有需要join的信息创建ConfigMap,建立相关的RBAC访问规则
- 让Bootstrap Tokens访问CSR签名API
- 配置自许可的新的CSR请求
安装内部DNS server(kube-dns)和kube-proxy组件。如果配置
--feature-gates=CoreDNS=true
,则CoreDNS会被安装- 如果以
--feature-gates=SelfHosting=true
启动,则静态的Pod的control plane会转换为self-hosted control plane
kubeadm init配置文件
配置文件现在仍然是alpha阶段。
kubeadm init
使用命令行选项配置,而现在也在尝试通过配置文件,此时只需要通过--config
选项指定。
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
api:
advertiseAddress: <address|string>
bindPort: <int>
etcd:
endpoints:
- <endpoint1|string>
- <endpoint2|string>
caFile: <path|string>
certFile: <path|string>
keyFile: <path|string>
dataDir: <path|string>
extraArgs:
<argument>: <value|string>
<argument>: <value|string>
image: <string>
kubeProxy:
config:
mode: <value|string>
networking:
dnsDomain: <string>
serviceSubnet: <cidr>
podSubnet: <cidr>
kubernetesVersion: <string>
cloudProvider: <string>
nodeName: <string>
authorizationModes:
- <authorizationMode1|string>
- <authorizationMode2|string>
token: <string>
tokenTTL: <time duration>
selfHosted: <bool>
apiServerExtraArgs:
<argument>: <value|string>
<argument>: <value|string>
controllerManagerExtraArgs:
<argument>: <value|string>
<argument>: <value|string>
schedulerExtraArgs:
<argument>: <value|string>
<argument>: <value|string>
apiServerExtraVolumes:
- name: <value|string>
hostPath: <value|string>
mountPath: <value|string>
controllerManagerExtraVolumes:
- name: <value|string>
hostPath: <value|string>
mountPath: <value|string>
schedulerExtraVolumes:
- name: <value|string>
hostPath: <value|string>
mountPath: <value|string>
apiServerCertSANs:
- <name1|string>
- <name2|string>
certificatesDir: <string>
imageRepository: <string>
unifiedControlPlaneImage: <string>
featureGates:
<feature>: <bool>
<feature>: <bool>
自定义参数
如果希望重写或扩展control plane组件的特性,可以为kubeadm提供额外的参数。
比如,增加额外的feature-gate参数
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
apiServerExtraArgs:
feature-gates: APIResponseCompression=true
如果需要为scheduler或controller-master做自定义配置,则分别使用schedulerExtraArgs
和controllerManagerExtraArgs
自定义镜像
默认,kubeadm会从k8s.gcr.io
拉取镜像;如果要求的kubernetes版本是CI版本,则需要使用gcr.io/kubernetes-ci-images
。
为使用自定义的镜像位置,可以:
提供imageRepository,取代
k8s.gcr.io
提供
unifiedControlPlaneImage
,而不是为control plane组件提供不同镜像提供
etcd.image
,而不是k8s.gcr.io
的镜像
自定义证书
默认,kubeadm会生成cluster运行的所有证书,而也可以使用自定义的证书。
如果使用自定义的证书,则可以指定--cert-dir
选项,或者在配置文件中设置CertificatesDir
。
默认存储地址是/etc/kubernetes/pki
。
如果,拷贝证书到/etc/kubernetes/pki/ca.crt
和/etc/kubernetes/pki/ca.key
,则kubeadm会使用CA为剩余的certs签名。
外部CA模式
如果不能同时提供ca.crt
和ca.key
,而其他的证书和kubeconfig文件都存在,则kubeadm会将其视为External CA模式。
drop-in file
drop-in file属于kubeadm的deb/rpm包。
[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"
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
配置 | 说明 |
---|---|
--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf | 当node join时,kubelet获取客户端证书的kubeconfig文件的路径 |
--kubeconfig=/etc/kubernetes/kubelet.conf | |
--pod-manifest-path=/etc/kubernetes/manifests | 读取static Pod manifest位置 |
--allow-privileged=true | 允许kubelet运行特权pod |
--network-plugin=cni | CNI网络 |
--cni-config-dir=/etc/cni/net.d | CNI配置文件 |
--cni-bin-dir=/opt/cni/bin | CNI二进制文件 |
--cluster-dns=10.96.0.10 | Pod中/etc/resolv.conf的nameserver |
--cluster-domain=cluster.local | Pod中/etc/resolv.conf中search |
--client-ca-file=/etc/kubernetes/pki/ca.crt | |
--authorization-mode=Webhook | |
--cadvisor-port=0 | 取消默认的监听0.0.0.0:4194,cAdvisor可以通过http://{node-ip}:10250/status/访问 |
--rotate-certificates | |
--cert-dir |
其他CRI运行时
自v1.6.0开始,kubernetes开始使用CRI(Container Runtime Interface)。
默认的容器运行时是Docker,其他的运行时包括:
cri-containerd
cri-o
frakti
rkt
当成功安装kubeadm和kubelet之后,可以安装上面的运行时。如果需要使用远程的CRI runtime,则需要修改RUNTIME_ENDPOINT
cat > /etc/systemd/system/kubelet.service.d/20-cri.conf <<EOF
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=$RUNTIME_ENDPOINT"
EOF
systemctl daemon-reload
集群的内部IP
可以在kubeadm init
时指定API Server的绑定IP
kubeadm init --apiserver-advertise-address=<private-master-ip>
当worker node被provisioned时,在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
配置工作节点的私有IP
--node-ip=<private-node-ip>
当运行kubeadm join
时,确保提供的私有API Server的私有IP。
Self-hosting kubernetes control plane
在kubernetes 1.8,可以创建self-hosted kubernetes control plane,这意味着关键组件,诸如API Server,Controller Manager,sheduler将以DaemonSet pods方式运行。
离线安装
如果需要离线启动kubeadm,则事先将所需要的master镜像下载。