1 说明
在以往的文档中介绍过二进制的方式安装kubernetes,二进制方式安装费事,费力还不好管理,本文以静态POD方式安装,处理kubelet其他组件都是以容器的方式启动。开始之前先介绍下什么是静态POD,通常情况下POD都是由kubernetes来创建的,但是在搭建kubernetes之前还没有集群,就没办法用kubernetes来创建pod。好在有一种方式可以脱离kubernetes集群,由kubelet来创建POD,这种用kubelet创建的POD,就称为静态POD。
既然不是通过kubernetes来创建的POD,当然该类POD就不属于kubernetes的管辖范围,不过kubelet会为该POD创建一个镜像POD,让kubernetes能看到镜像POD,这样就可以从kubernetes集群内通过kubectl工具看到该POD,当该POD删除的时候镜像POD也就删除了。
kubelet在启动的时候会去--manifests目录中找相应的yaml文件,让后创建对应的POD,默认的manifests目录是/etc/kubernetes/manifests
以上就是对静态POD的说明
2 构架规划
本文使用到的相关机器如下,etcd是单台,建议用集群,本文k8s master为单点。
3 初始化
3.1 网络规划
master-ip: 192.168.20.90
cluster-cidr: 10.244.0.0/16
service-ip-range: 10.96.0.0/12
dns: 10.96.0.10
bootstrap token
token-id: head -c 6 /dev/urandom | md5sum | head -c 6 (用该命令生成)
token-secret: head -c 16 /dev/urandom | md5sum | head -c 16 (用该命令生成)
3.2 所需软件
更新ubuntu源,建议用阿里云的源
apt-get update && apt-get install -y apt-transport-https curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat >/etc/apt/sources.list.d/kubernetes.list <
3.3 禁用swap
临时命令:swapoff -a
永久命令:注释/etc/fstab相关行
3.4 相关目录
[ ! -d "/etc/cni/net.d" ] && mkdir -p /etc/cni/net.d
[ ! -d "/tmp/cert" ] && mkdir /tmp/cert
[ ! -d "/etc/kubernetes/pki/etcd" ] && mkdir -p /etc/kubernetes/pki/etcd
[ ! -d "/etc/kubernetes/manifests" ] && mkdir -p /etc/kubernetes/manifests
[ ! -d /var/lib/kubelet ] && mkdir -p /var/lib/kubelet
4 自签发证书
4.1 工具准备
用cfssl这个工具来生成自签证书
curl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfsslinfo
chmod +x /usr/local/bin/cfssl*
4.2 所需证书
签名文件,所有证书都用这个配置文件
cat >/tmp/cert/config.json<
4.2.1 根证书
本文用同一个根证书
cat >/tmp/cert/ca.json<
注意expiry证书的过期时间,默认为8760h,即一年。
4.2.2 etcd server端证书
hosts里面把所有etcd节点都写上,本文只有一个节点
cat >/tmp/cert/etcd-server.json<
4.2.3 etcd peer 证书
用于etcd集群节点内部的验证
hosts里面把所有etcd节点都写上,本文只有一个节点
cat >/tmp/cert/etcd-peer.json<
4.2.4 etcd-client证书
用于apiserver访问etcd,apiserver作为etcd的客户端
cat >/tmp/cert/etcd-client.json<
4.2.5 cluster admin证书
用户管理员管理kubernetes集群
cat > /tmp/cert/admin.json<
4.2.6 apiserver证书
hosts里面写apiserver节点的ip,cluster_cidr段的第一个ip,service-ip-range段的第一个ip,DNS的ip。
cat >/tmp/cert/apiserver.json<
4.2.7 apiserver-kubelet-client
用于apiserver和kubelet通信,O 为"system:masters"组,默认就有kubernetes所有资源的所有操作权限
cat >/tmp/cert/apiserver-kubelet-client.json<
4.2.8 controller-manager
用于controller-manager访问apiserver
cat >/tmp/cert/controller-manager.json<
4.2.9 scheduler
用于scheduler和apiserver交互
cat >/tmp/cert/scheduler.json<
4.2.10 front-proxy-ca
用于apiserver aggregator
cat >/tmp/cert/front-proxy-ca.json<
4.2.11 front-proxy-client
用于apiserver aggregator
cat >/tmp/cert/front-proxy-client.json<
4.1.12 serviceaccount证书
用于pod和apiserver交互
cd /tmp/cert
openssl genrsa -out sa.key 1024 && openssl rsa -in sa.key -pubout -out sa.pub
共签发了20多个证书
4.3 分发证书
将图示的证书分别copy到/etc/kubernetes/pki目录以及/etc/kubernetes/pki/etcd目录下。pki 和pki/etcd中的ca证书是一样的。
5 生成kubeconfig文件
用签发的各类证书,创建各个组件的配置文件,这个组件将利用创建的配置文件和apiserver通信,注意替换master_ip 为实际的master ip
5.1 controller-manage.conf
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-credentials system:kube-controller-manager --client-certificate=/etc/kubernetes/pki/controller-manager.crt --embed-certs=true --client-key=/etc/kubernetes/pki/controller-manager.key --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-context system:kube-controller-manager@kubernetes --cluster=kubernetes --user=system:kube-controller-manager --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config use-context system:kube-controller-manager@kubernetes --kubeconfig=/etc/kubernetes/controller-manager.conf
5.2 scheduler.conf
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-credentials system:kube-scheduler --client-certificate=/etc/kubernetes/pki/scheduler.crt --embed-certs=true --client-key=/etc/kubernetes/pki/scheduler.key --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-context system:kube-scheduler@kubernetes --cluster=kubernetes --user=system:kube-scheduler --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config use-context system:kube-scheduler@kubernetes --kubeconfig=/etc/kubernetes/scheduler.conf
5.3 cluster-admin.conf
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/$(whoami)/.kube/config
kubectl config set-credentials kubernetes-admin --client-certificate=/etc/kubernetes/pki/admin.crt --embed-certs=true --client-key=/etc/kubernetes/pki/admin.key --kubeconfig=/$(whoami)/.kube/config
kubectl config set-context kubernetes-admin@kubernetes --cluster=kubernetes --user=kubernetes-admin --kubeconfig=/$(whoami)/.kube/config
kubectl config use-context kubernetes-admin@kubernetes --kubeconfig=/$(whoami)/.kube/config
5.4 kubelet-bootstrap.conf
注意其中的--token,格式为: 6位随机字符.16为随机字符,这是一个临时token,kubelet第一次和apiserver通信的引导文件,具体原理在Kubelet TLS Bootstrap是啥中有介绍
kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-credentials kubelet-bootstrap --token=${token-id}.${token-secret} --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-context kubelet-bootstrap@kubernetes --cluster=kubernetes --user=kubelet-bootstrap --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config use-context kubelet-bootstrap@kubernetes --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
6 yaml文件启动相关容器
6.1 apiserver.yml
cat >/etc/kubernetes/manifests/apiserver.yaml<
6.2 controller-manager.yml
cat >/etc/kubernetes/manifests/controller-manager.yaml<
6.3 scheduler.yml
cat >/etc/kubernetes/manifests/scheduler.yaml<
6.4 kubelet.yml
cat >/var/lib/kubelet/config.yaml<
7 kubelet服务
7.1 kubelet.service 文件
cat >/lib/systemd/system/kubelet.service <
7.2 重启kubelet服务
systemctl daemon-reload
systemctl restart kubelet
此时会看到集群已经启动,但是master节点是处于noready状态,因为节点还没有注册进来
8 创建bootstrap secret
cat <"
name: bootstrap-token-${token-id}
namespace: kube-system
# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
# Human readable description. Optional.
description: "The default bootstrap token generated by 'kubeadm init'."
# Token ID and secret. Required.
token-id: '${token-id}'
token-secret: '${token-secret}'
# Expiration. Optional.
expiration: 2020-12-10T00:00:11Z
# Allowed usages.
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
# Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
auth-extra-groups: system:bootstrappers:kubelet-bootstrap
EOF
9 CSR授权
cat <
现在节点应该加入集群了
10 踩坑
问题1
User "system:anonymous" cannot get resource "nodes" in API group "" at the cluster scope
解决:
注意csr secret中的token 是否和bootstrap-kubelet.conf中的token是否一致
问题2
Unable to register node "k8s-master" with API server: nodes is forbidden: User "system:anonymous" cannot create resource "nodes" in API group "" at the cluster scope
解决:
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --group=system:bootstrappers
问题3
invalid bearer token
token 过期或是无效
问题4
可能会遇到10.96.0.1:443 i/o timeout
解决
kube-proxy-configmap
data.kubeconfig.conf.clusters.cluster.server: https://192.168.20.104:6443 (master ip要写对,否则会导致proxy 启动错误,IPtable没有生效,10.96.0.1没有转发规则)