2.Kubernetes权威指南 --- Kubernetes安装配置指南

本文详细介绍了如何一步步配置和安装Kubernetes集群,包括必备组件的设置、节点准备和集群验证等关键步骤,旨在为读者提供全面的k8s部署指南。
摘要由CSDN通过智能技术生成
第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的主机名:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值