第2章 Kubernetes安装配置指南
2.1 系统要求
节点:
Master:至少 2C4G
Node: 至少 4G16G
Linux操作系统:
kubeadm 推荐关闭交换空间,swapoff -a,然后在 /etc/fstab 中删除对 swap的加载。
etcd:
3.0 版本及以上。
Docker:
18.03 版本及以上。
k8s 需要容器运行时(Container Runtime Interface, CRI)的支持,目前官方支持的容器包括:Docker,Containerd,CRI-O和frakit。
Linux 关闭防火墙和 SELinux。
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
2.2 使用kubeadm工具快速安装Kubernetes集群
最简单的方法是 yum install kubernetes 命令安装 k8s 集群,但仍需要修改各组件的启动参数,才能完成对 k8s 集群的配置,整个过程
比较复杂,也容器出错。k8s 从 1.14 开始就引入了命令行工具 kubeadm,简化安装过程。从k8s 1.13版本开始,kubeadm工具进入了GA阶段,
宣称已经为生产环境准备就绪。
2.2.1 安装kubeadm和相关工具
1.配置yum源
//google的源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
//阿里云的源
https://www.cnblogs.com/tylerzhou/p/10971336.html
http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.运行yum install 安装命令
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
3.启动Docker和kubelet(先安装docker 和生成配置文件)
systemctl enable kubelet
//可能需要在 kubeadm config 后面启动
systemctl start kubelet
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
2.2.2 kubeadm config
kubeadm 已经进入 GA 阶段,其控制面板初始化和加入节点步骤都支持大量的可定制内容,因此 kubeadm 还提供了配置文件功能用于复杂的定制。同时,kubeadm
将配置文件以ConfigMap的形式保存到集群中,便于后续的查询和升级工作。kubeadm config 子命令提供了对这一组功能的支持。
//取得默认的初始化参数文件
kubeadm config print init-defaults > init.default.yaml
//复制一份
cp init.default.yaml kubeadm.yaml
//修改源
vim kubeadm.yaml
imageRepository: k8s.gcr.io
改成 阿里云的源 :
imageRepository: registry.aliyuncs.com/google_containers
-------------
vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.10.200.108
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
-------------
https://segmentfault.com/a/1190000038248999
2.2.3 下载Kubernetes的相关镜像
//将docker的源换成国内的
echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
//使用 config images pull 子命令下载所需要的镜像
kubeadm config images pull --config=kubeadm.yaml
//查看所需的镜像版本
kubeadm config images list
//修改/etc/hosts文件
10.10.200.108 dev-master
2.2.4 运行kubeadm init命令安装Master
//执行 kubeadm init 命令安装 k8s 的 Master
kubeadm init --config=kubeadm.yaml
注意的是:kubeadm 的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm 初步安装完成后的集群不具备网络通信功能,任何Pod自带的CoreDNS都无法正常工作。
而网络插件的安装往往对 kubeadm init 命令的参数有一定的要求。
报错1:It seems like the kubelet isn't running or healthy.
I faced similar issue recently. The problem was cgroup driver. Kubernetes cgroup driver was set to systems but docker was set to systemd. So I created /etc/docker/daemon.json and added below:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
报错2:k8s [kubelet-check] Initial timeout of 40s passed.解决方案
将init-config.yaml 中的 advertiseAddress: 1.2.3.4 修改为advertiseAddress: 10.0.128.0,其中10.0.128.0为 master节点的ip地址。
kubeadm reset
https://blog.csdn.net/weixin_44789466/article/details/119046245
//加入集群的命令
kubeadm join 10.10.200.108:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:fda84a64cea19837aec36a58e608d4406d779aff79a2504d96de0b3723288637
//复制配置文件到普通用户的home目录下
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):(id -g) $HOME/.kube/config
报错3:Kubernetes-kubectl命令出现错误【The connection to the server localhost:8080 was refused - did you specif...
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
https://developer.aliyun.com/article/652961
2.2.5 安装Node,加入集群
1.安装 kubeadm 相关工具
2.启动docker服务和kubelet
3.为kubeadm命令生成配置文件。创建文件 join-config.yaml,如下:
-------------
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 10.10.200.108:6443
token: abcdef.0123456789abcdef
unsafeSkipCAVerification: true
tlsBootstrapToken: abcdef.0123456789abcdef
-------------
4.执行 kubeadm join 命令
kubeadm join --config=join-kubeadm.yaml
kubeadm 在 Master 上也安装了 kubelet,在默认情况下并不参与工作负载。如果希望安装一个单机 All-In-One 的k8s环境,则可以执行下面的命令,让Master
成为一个Node:
kubectl taint nodes --all node-role.kubernetes.io/master-
http://blog.hungtcs.top/2019/11/27/23-K8S%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B%E7%AC%94%E8%AE%B0/
2.2.6 安装网络插件
执行 kubectl get nodes 命令,会发现 k8s 提示 Master 为 NotReady 状态,这是因为还没有安装 CNI 网络插件。选择 weave插件,一键安装。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
2.2.7 验证Kubernetes集群是否安装完成
执行下面的命令,验证 k8s 集群的相关Pod是否都正常运行:
kubectl get pods --all-namespaces
如果发现有状态错误的pod,则可以执行 kubectl --namespace=kube-system describe pod <pod_name> 来查看错误原因,常见的是镜像没有完成下载。
如果安装失败,可以执行 kubeadm reset 命令将主机恢复原状,重新执行 kubeadm init 命令,再次安装。
//帮助文章
https://www.cnblogs.com/tylerzhou/p/10971336.html
https://zhuanlan.zhihu.com/p/55740564
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull/
https://segmentfault.com/a/1190000038248999
https://stackoverflow.com/questions/52119985/kubeadm-init-shows-kubelet-isnt-running-or-healthy
//重新初始化 kubeadm
https://cloud.tencent.com/developer/article/1706820
2.3 以二进制文件方式安装Kubernetes集群
打开 https://github.com/kubernetes/kubernetes/releases , 点击 changelog;
2.3.1 Master上的etcd、kube-apiserver、kube-controller-manager、kube-scheduler服务
2.3.2 Node上的kubelet、kube-proxy服务
2.4 Kubernetes集群的安全设置
2.4.1 基于CA签名的双向数字证书认证方式
在一个安全的内网环境中,k8s 的各个组件与Master之间可以通过 kube-apiserver 的非安全端口 http://<kube-apiserver-ip>:8080 进行访问。但如果
API Server 需要对外提供访问,或者集群中的某些容器也需要访问 API Server 以获取集群中的某些信息,则更安全的做法是启用https安全机制。k8s 提供了基于CA
签名的双向数字证书认证方式和简单的基于HTTP Base或Token的认证方式,其中CA证书方式的安全性最高。
基于CA签名的双向数字证书的生成过程包括如下:
1.为kube-apiserver 生成一个数字证书,并用CA证书签名;
2.为kube-apiserver 进程配置证书相关的启动参数,包括CA证书(用于验证客户端证书的签名真伪)、自己的经过CA签名后的证书及私钥;
3.为每个访问 kus API Server的客户端(如 kube-controller-manager,kube-scheduler,kubelet,kube-proxy及调用API Server 的客户端程序
kubectl等)进程都生成自己的数字证书,也都用CA证书签名,在相关程序的启动参数里增加CA证书、自己的证书等相关参数。
1.设置 kube-apiserver 的CA 证书相关的文件和启动参数
使用OpenSSL 工具在 Master服务器上创建CA证书和私钥相关的文件。
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=dev-master" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048
-sub 参数中 "/CN"的值为Master的主机名。
准备 master_ssl.cnf 文件,该文件用于 x509 v3 版本的证书。在该文件中主要需要设置 Master 服务器的 hostname(k8s-master)、
IP地址(192.168.18.3),以及 k8s Master Service 的虚拟服务器名称(kubernetes.default等)和该虚拟服务的ClusterIP地址(169.169.0.1)。
master_ssl.cnf 文件的示例如下:
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-master
IP.1 = 169.169.0.1
IP.2 = 192.168.18.3
基于 master_ssl.conf 创建server.csr 和 server,crt 文件。在生成 server.csr时,-subj 参数中"/CN"的值需要为Master的主机名:
2.Kubernetes权威指南 --- Kubernetes安装配置指南
于 2022-04-03 19:11:01 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)