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做自定义配置,则分别使用schedulerExtraArgscontrollerManagerExtraArgs

自定义镜像

默认,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.crtca.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镜像下载。

results matching ""

    No results matching ""