环境: master:10.4.7.230 node01:10.4.7.240 node02:10.4.7.241 OS:CentOS 7.8 配置:master 2核,3G node01 node02 2核,4G k8s 版本 1.22.0 一、基础设置:[所有节点上面都要操作] 关闭 firewall-cmd selinux hosts文件,各个节点,要添加关闭swap分区: swapoff -a #临时关闭 vi /etc/fstab ##永久关闭 禁用 swap分区的挂载 将桥接的IPV4流量传递到iptables 的链 #防止ipv4的一些流量,不能被iptables给拦截, 官方建议是启用,防止丢包,不启用的话,网络会有一些小的问题 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF ## sysctl --system ## 使其上面配置生效 时间同步: yum install ntpdate -y ntpdate time.windows.com ##涉及到 证书,至少要求 集群内的时间是一样的 二、安装docker [所有节点上都要安装] wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum install docker-ce -y systemctl enable docker systemctl start docker ## 配置镜像下载加速器:[所有节点都要配置] cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF ## "exec-opts": ["native.cgroupdriver=systemd"] 这一行不加的话,后面初始化master时会报错
重启docker: systemctl restart docker docker info ##查看docker 信息 三、安装 Kubeadm ,kubelet 和 kubectl [所有节点都要安装] 添加 阿里云 yum源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF ########*********** kubeadm 不单纯是简化部署k8s集群,而是采用了容器化方式部署 k8s组件 (kubeadm 会自动 部署 kube-apiserver scheduler controller-manager etcd kube-proxy) master : kube-apiserver scheduler controller-manager etcd node: kubelet(非容器化) kube-proxy #########********** ##由于 k8s版本更新频繁,(每三个月更新一个版本) ## 这里指定版本号部署: yum install kubelet-1.22.0 kubeadm-1.22.0 kubectl-1.22.0 -y ### 安装好后,不要启动 kubelet ,你也启动不了,因为kubelet需要配置文件,kubadm会生成这个配置文件,kubeadm 会自动帮我们启动这个 kubelet ,我们只需要设置一个,开机启动 kubelet 就可以了 systemctl enable kubelet 四、### 部署Kubernetes Master 在 master 节点上进行 部署 在10.4.7.230(Master)执行。 kubeadm init \ --apiserver-advertise-address=10.4.7.230 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.0 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --ignore-preflight-errors=all ##参数说明: --apiserver-advertise-address 集群通告地址 --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址 --kubernetes-version K8s版本,与上面安装的一致 --service-cidr 集群内部虚拟网络,Pod统一访问入口 --pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致 ###############如果安装报错: [kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused. docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup驱动 解决方法: kubeadm reset vim /etc/docker/daemon.json { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } systemctl daemon-reload systemctl restart docker 即可重新初始化即可成功。 ################ ### kubeadm init 初始化工作:经历了那些步骤 第一步,[preflight] 环境检查和拉取镜像 kubeadm config images pull 第二步,[certs] 生成k8s证书和 etcd 证书,证书目录,/etc/kubernetes/pki 第三步,[kubeconfig] 生成kubeconfig文件,这个文件主要用来 认证, 判断你有没有权限来连接我 第四步,[kubelet-start] 生成 kubelet的配置文件,/var/lib/kubelet/config.yaml 启动kubelet 第五步,[control-plane] 部署管理节点组件,用镜像启动容器。kubectl get pods -n kube-system 第六步,[etcd] 部署etcd 数据库,用镜像启动容器 第七步,[upload-config] [kubelet] [upload-certs]上传配置文件到k8s中, 第八步,[mark-control-plane] 给管理节点添加一个标签,[node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers],再添加一个污点 [node-role.kubernetes.io/master:NoSchedule],添加污点的作用,让新创建的容器,不要分配在我这个节点上。 第九步,[bootstrap-token] 自动为kubelet 颁发 证书 第十步,部署了相关插件,coreDNS 为k8s 内部提供DNS解析 , kube-proxy 最后,拷贝连接 k8s集群的认证文件到默认路径下 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ############################## 初始化成功提示:
拷贝kubectl使用的连接k8s认证文件到默认路径: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config 查看工作节点: kubectl get nodes
注:由于网络插件还没有部署,状态显示,还没有准备就绪 NotReady ####@@@@@@ 五、加入Kubernetes Node,在另外两个node上面执行 在其他node 节点 上执行 如下命令,添加节点 kubeadm join 10.4.7.230:6443 --token kw424w.r1j35e41ck7v3mpg \ --discovery-token-ca-cert-hash sha256:cfe29be7b54e63e8dc1a7bbe593d5c2ec97cd1711f3ef5411939d6a26da42f95
######### 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成: kubeadm token create --print-join-command 参考资料:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
注:由于网络插件还没有部署,还没有准备就绪 NotReady 六、部署容器网络(CNI),安装calico 【master 节点上安装】 Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。 下载yaml文件: wget --no-check-certificate https://docs.projectcalico.org/manifests/calico.yaml 在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 0.0.0.0, :: 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443... 失败:拒绝连接。 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|::|:443... 失败:拒绝连接。 下载不了,是网络的问题,可以直接在浏览器中下载。 上传已下载好的 calico.yaml 到master vim calico.yaml 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
修改完后文件后,保存退出。 开始部署: kubectl apply -f calico.yaml kubectl get pods -n kube-system ##查看pod,在kube-system名称空间中,kubeadm以容器化方式部署的k8s插件的pod都是在kube-system名称空间中 等Calico Pod都Running,节点也会准备就绪: 下载镜像会比较慢一点, 参考资料:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
kubectl get pods -n kube-system
![]()
![]()
这时,再查看 节点状态:
七. 测试kubernetes集群 在Kubernetes集群中创建一个pod,验证是否正常运行: master 节点上运行: kubectl create deployment nginx --image=nginx ## 第一个nginx 是 deployment 名称,后面nginx 是使用的镜像
deployment 可以简写成 deploy Deployment是k8s用来管理部署无状态Pod的控制器。 默认创建的pod 在 default 名称空间,kubectl get pods ## 默认查看的是 default 名称空间
此时这个deployment里的nginx pod还无法对外界提供服务。 我们创建一个service让外界能够消费。使用命令行创建这样的一个service: kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
kubectl get pods -o wide
访问地址:http://NodeIP:Port
八、部署Dashboard 【master节点上操作】 Dashboard是官方提供的一个UI,可用于基本管理K8s资源。 下载dashboard的yaml 文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
下载失败的解决办法: 浏览器打开 https://www.ipaddress.com/
![]()
在 master 节点上,hosts文件中,添加一条 主机记录【108.133测试不行】
再次重新下载。 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml 默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部: vi recommended.yaml
应用这个recommended.yaml文件 kubectl apply -f recommended.yaml
执行成功后,稍等一会,进行查看 pod kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard
访问地址:https://NodeIP:30065
![]()
输入的时候,可以包括引号,也可以不输入引号,没有空格,而且不会显示。
此处,我们选择,Token登录 创建Token 创建service account并绑定默认cluster-admin管理员集群角色: # 创建用户 kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
##查看 创建的Token kubectl get secret -n kube-system |grep dashboard
# 获取用户Token kubectl describe secret dashboard-admin-token-pk54c -n kube-system
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') 此命令 和 上面 一条命令,功能都一样,都是查看Token ###使用输出的token登录Dashboard。
![]()
![]()
![]()
![]()