使用docker engine 运行时 集群部署 kubernetes v1.23
硬件环境:
- 使用 VMware16 模拟3台服务器,建立1个control plane(master),2个work 节点的kubernetes集群
- 使用 Ubuntu server 20.04 TLS 作为Linux系统环境
系统安装
- 使用典型配置即可。操作系统选择 Ubuntu 64位
系统安装过程中,在网络连接的时候,选择DHCPv4,自动获取IP地址即可。
- 如果DHCPv4 无法自动获取IP,打开虚拟网络编辑器还原默认设置。
设置镜像来源的时候,将默认的更改为
https://mirrors.tuna.tsinghua.edu.cn/ubuntu
中途无需选择其他组件安装,只需要打开open SSH即可。
初始环境设置
安装net-tools,查看IP地址,以便在外部使用SSH连接(因为内部终端不好用,没办法复制粘贴)
sudo apt update sudo apt install net-tools
查看IP
ifconfig
=====> 看到 IP 192.168.145.140
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.145.140 netmask 255.255.255.0 broadcast 192.168.145.255inet6 fe80::250:56ff:fe3e:d6c7 prefixlen 64 scopeid 0x20<link>ether 00:50:56:3e:d6:c7 txqueuelen 1000 (Ethernet)RX packets 67260 bytes 82597310 (82.5 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 21345 bytes 4844931 (4.8 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
外部SSH客户端连接
例如:
ssh master@192.168.145.140
关闭swap分区(root 权限)
swapoff -a
永久关闭(不然重启过后,kubelet就无法运行)
vim /etc/fstab
注释掉最后一行
#/swap.img none swap sw 0 0
安装docker
sudo apt install docker.io
验证
docker version
修改docker驱动
sudo vim /etc/docker/daemon.json
{"exec-opts":["native.cgroupdriver=systemd"] }
重启
systemctl restart docker
设置开启自启
systemctl enable docker.service
安装kubernetes 前置
sudo apt-get update && sudo apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF
apt-get update
安装 kubelet kubectl kubeadm
尽量选择一个固定的版本
apt install kubelet=1.23.6-00 kubectl=1.23.6-00 kubeadm=1.23.6-00
- 不同组件的版本支持情况 https://kubernetes.feisky.xyz/setup/upgrade
- 最好就是保持版本相同
- kubernetes自1.20,放弃了docker支持,在 Kubernetes 1.24 版本中移除了dockershim, 所以如果 kubelet版本高于1.23,后面的安装可能就有问题。除非你使用其他运行时。
- 不同组件的版本支持情况 https://kubernetes.feisky.xyz/setup/upgrade
验证
kubectl version、 kubelet --version、 kubeadm version
root@work1:/home/master# kubectl version Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6", GitCommit:"ad3338546da947756e8a88aa6822e9c11e7eac22", GitTreeState:"clean", BuildDate:"2022-04-14T08:49:13Z", GoVersion:"go1.17.9", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port?root@work1:/home/master# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6", GitCommit:"ad3338546da947756e8a88aa6822e9c11e7eac22", GitTreeState:"clean", BuildDate:"2022-04-14T08:48:05Z", GoVersion:"go1.17.9", Compiler:"gc", Platform:"linux/amd64"}root@work1:/home/master# kubelet --version Kubernetes v1.23.6
设置开启自启
systemctl enable kubelet
创建其他节点
- 以此虚拟机作为母版,创建 控制平面节点、工作节点
- 建议每几个关键步骤都生成一个快照。方便操作错误,快速回滚。
control plan
创建连接克隆
- 选择该虚拟机==>右键==>管理==>克隆==>链接克隆
修改 mac 地址
因为克隆出来的 mac 地址也是一样的,而mac需要唯一,不然两个同时起来,会有冲突
- 编辑虚拟机设置-网络适配器-高级-mac地址生成
开机
修改主机名字,方便后面清楚在操作谁
hostnamectl set-hostname master
固定虚拟机的IP地址(非常重要,不然IP一直变化,集群直接失效)
sudo vim /etc/netplan/00-installer-config.yaml
写如下信息(按ifconfig中的信息,适当改写)
# This is the network config written by 'subiquity' network:ethernets:ens33: #配置的网卡的名称addresses: [192.168.145.140/24] #配置的静态ip地址和掩码dhcp4: no #关闭DHCP,如果需要打开DHCP则写yesoptional: truegateway4: 192.168.145.2nameservers:addresses: [8.8.8.8,8.8.4.4]version: 2renderer: networkd
使生效
sudo netplan apply
work node
操作如上。注意IP地址的分配。
control plane 初始化
只在 control plane 中运行以下命令,work 节点不需要
若某一步骤失败,重新运行之前,先还原设置 运行
kubeadm reset
初始化命令
- 可以指定 kubernetes 版本 --kubernetes-version=v1.23.14,若不指定,则系统默认。
- pod的网络,可以按需填写。可直接使用下面的地址。
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
成功后
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.145.132:6443 --token zzo4m1.zbwbhl223km7kv6h --discovery-token-ca-cert-hash sha256:478678ef11485c6a131f9778bdfbb19cb7f1aefddcf249618be1ffd76891461d
- 若失败,请考虑是否是 kebuctl kubelet kubeadm 版本问题
运行提示中的指令
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
记住work 节点加入集群的指令
kubeadm join 192.168.145.132:6443 --token zzo4m1.zbwbhl223km7kv6h --discovery-token-ca-cert-hash sha256:478678ef11485c6a131f9778bdfbb19cb7f1aefddcf249618be1ffd76891461d
输入指令查看节点(root)
kubectl get nodes
- not ready 是因为还没有部署pod
部署一个 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
再次查看节点,应该ready了
kubectl get nodes
work 节点部署
直接运行上面提到的加入指令
kubeadm join 192.168.145.132:6443 --token zzo4m1.zbwbhl223km7kv6h --discovery-token-ca-cert-hash sha256:478678ef11485c6a131f9778bdfbb19cb7f1aefddcf249618be1ffd76891461d
如果不成功,先运行
kubeadm reset
再排查原因,再次运行指令
两个节点都运行结束后,control plane 中应该可以看到信息
回到 control plane,运行
kubectl get nodes
应该可以看到
root@master:/home/master# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 3h37m v1.23.6 work1 Ready <none> 10m v1.23.6 work2 Ready <none> 111s v1.23.6
创建 Pod 验证集群
- 在control plane 中运行指令
使用 kubectl 创建一个 nginx
kubectl create deployment nginx --image=nginx
创建一个服务,并且暴露端口让外部可以访问(后面可以跟–target-port=80指定暴露的外部访问的端口,我这里让它随机选择)
kubectl expose deployment nginx --port=80 --type=NodePort
查看pod和service的状态
kubectl get pods,svc
root@master:/home/master# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/nginx-85b98978db-mn4cc 1/1 Running 0 3h36mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7h41m service/nginx NodePort 10.109.113.11 <none> 80:30432/TCP 3h36m
使用此指令可以看pod详细信息
kubectl describe pod nginx
访问一下 nginx
集群中随意一个IP + 端口
http://192.168.145.132:30432/
可视化界面 dashboard
dashboard 作为一个普通的work节点,部署在k8s上。
去官网找到对应的兼容版本 https://github.com/kubernetes/dashboard/releases/
安装指令
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
验证是否成功
master@master:~$ kubectl get pods --namespace=kubernetes-dashboard NAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-799d786dbf-98d6p 1/1 Running 0 38s kubernetes-dashboard-fb8648fd9-z85h8 1/1 Running 0 38s
暴露端口,让外面访问
kubectl patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' -n kubernetes-dashboard
可以看到已有端口
master@master:~$ kubectl get svc -n kubernetes-dashboard NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.100.43.199 <none> 8000/TCP 14m kubernetes-dashboard NodePort 10.108.211.17 <none> 443:32699/TCP 14m
集群中任意一台主机IP+端口访问,注意加 HTTPS
创建用户,进入dashboard
cat <<EOF > account.yml # Create Service Account apiVersion: v1 kind: ServiceAccount metadata:name: admin-usernamespace: kube-system --- # Create ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: admin-user roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin subjects: - kind: ServiceAccountname: admin-usernamespace: kube-systemEOF
应用 yml
kubectl apply -f account.yml
查看token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
可以得到
Name: admin-user-token-lt7q6 Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name: admin-userkubernetes.io/service-account.uid: 7aee1787-fc20-4c9a-84b6-645ddfd08158Type: kubernetes.io/service-account-tokenData ==== ca.crt: 1099 bytes namespace: 11 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkR2RWxIbkkwYW1Fb0Nnb1I1YWU1TUdaVDYwN1d2S1lRWk5XOVB5QTZmQjAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWx0N3E2Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI3YWVlMTc4Ny1mYzIwLTRjOWEtODRiNi02NDVkZGZkMDgxNTgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.ziGadAjGozAPE4uLljn0Y1Fl-nAsJSti3gSwDglAssBBVI7I2MyX1XAMtFi7UYpj_uUQj5QRoXMC34PGztq1xHLDrJZgOz_LmOAnt5NJUC0k5GrV0pg5syob8NAaJmx4piEhbIitnPwczxS1FD4Et-IEQyyRN8kaJX2aAoL89DCWXDIpbmUqNbRfZ1R2Ldug1VPTNziIXtpquyTnpKHgCIZETBNijoPtduxfEVqwodVAAUkbuVYyE0eUWgQGSxwU2BcFpAzhMzJ3rkyNkAgJLJ8izu3wuQMDlbXxx5yf3DhvJXvphEVPT3PUyWnNj8_guIghHlAepiTq9nBSaVJXaA
进入dashboard
得到token后,就可以进入dashboard
2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.ziGadAjGozAPE4uLljn0Y1Fl-nAsJSti3gSwDglAssBBVI7I2MyX1XAMtFi7UYpj_uUQj5QRoXMC34PGztq1xHLDrJZgOz_LmOAnt5NJUC0k5GrV0pg5syob8NAaJmx4piEhbIitnPwczxS1FD4Et-IEQyyRN8kaJX2aAoL89DCWXDIpbmUqNbRfZ1R2Ldug1VPTNziIXtpquyTnpKHgCIZETBNijoPtduxfEVqwodVAAUkbuVYyE0eUWgQGSxwU2BcFpAzhMzJ3rkyNkAgJLJ8izu3wuQMDlbXxx5yf3DhvJXvphEVPT3PUyWnNj8_guIghHlAepiTq9nBSaVJXaA
- 进入dashboard
得到token后,就可以进入dashboard
使用docker engine 运行时 集群部署 kubernetes v1.23相关推荐
- kubeadm 部署 kubernetes:v1.23.4集群
一.安装前的准备 !!!以下操作需要在所有master和node上执行 1.1.关闭selinux,关闭防火墙 1.2.添加hosts解析 192.168.122.160 master 192.168 ...
- Swarm集群搭建( docker安装、docker-compose安装、portainer可视化安装、基本使用命令总结、项目集群部署案例)
docker安装.docker-compose安装.Swarm集群搭建.portainer可视化安装.和项目部署案例 四台服务器,我这里选用四台虚拟机1核2G,系统centos7,ip:192.168 ...
- k8s集群部署springcloud 单应用
k8s集群部署springcloud 单应用 docker配置docker私库 docker build 镜像 k8s集群部署 镜像 验证部署结果 1. docker配置docker私库 1.1 编辑 ...
- Docker Swarm集群部署
Docker Swarm集群部署 1 方案介绍 1.1 概述 1.2 软件包 2 Swarm集群搭建 2.1 IP规划 2.2 基础配置 2.2.1 关闭SELinux 2.2.2 关闭防火墙或开放需 ...
- K8S+Jenkins+Harbor+Docker+gitlab集群部署
K8S+Jenkins+Harbor+Docker+gitlab服务器集群部署 所需资源下载地址 将此文章写给我最心爱的女孩 目录 K8S+Jenkins+Harbor+Docker+gitlab服务 ...
- 基于Docker运行弹性集群的五个关键点第一篇:运行高可用模式
原文来源:Rancher Labs 类似Rancher这种的容器管理和编排工具,它可以很快地让每个组织获得高效的弹性集群管理能力.当前技术世界的发展形势就是让开发人员从繁琐的应用配置和管理中解放出来, ...
- mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】
背景 [注意]: 鄙人认为本篇适合做入门测试/学习之用,选择的 "单机多节点配置",后面再整理 "多机配置"文章. 近期正突击学习数据库知识 想着对 PXC 集 ...
- docker集群部署:第3部分:服务
docker集群部署:第3部分:服务 介绍 在第3部分中,我们将扩展应用程序并实现负载平衡. 关于服务 在分布式应用程序中,应用程序的不同部分被称为"服务".例如,一个视频共享站点 ...
- CentOS7 下 MySQL 之 PXC 集群部署【Docker+多机多节点】
背景 最近在进行 MySQL 集群搭建测试的研究中 对于业界主流方案自然不能跳过 在此,整理成完整的文章,希望道友能得到参考价值 - 对于 docker 不熟悉的小伙伴,个人建议移步文章 -- [Ce ...
最新文章
- 【SAP技术】SAP MM 如何看一个自定义移动类型是复制哪个标准移动类型而创建的?
- 接口测试01 - HTTP协议报文结构及示例
- SpringMVC的数据响应-回写数据
- 基于IPv6数据包分析
- Java黑皮书课后题第10章:*10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal
- iPhone系统常用文件夹位置
- java 时间处理经典案例
- jq分页 不刷新页面_滑动无限加载和分页哪个对搜索引擎更友好呢?
- 从Waymo挖来感知负责人张一萌,以及Pony.ai的又半年
- VS2015+OpenCV3.4.2+Win10+简单调用摄像头
- 【转】socket提交http表单 [C++]
- javascript鼠标效果
- AS打包出现app:transformClassesAndResourcesWithProguardForRelease错误
- 线性调频信号(Chirp信号)公式
- android qq授权管理软件,android QQ第三方授权登录接入流程
- 论文数据统计Task1
- PHP查询附近的人及其距离的实现方法
- MySQL UPDATE 更新
- Android Studio Buid缓慢问题
- 欢乐庆团圆--记华清远见嵌入式学院老学员联谊会
热门文章
- 批量查找替换excel单元格中的软回车(alt + enter)
- python 导入sklearn时报错: no model named ‘murmurhash‘
- BroadcastManager
- 强大数定理,弱大数定理,和中心极限定理
- J-Link 安装和配置
- 更新KB5005565补丁后win10局域网打印机不能共享打印
- WPF使用SaveFileDialog对话框保存文件时不要用DialogResult.OK判断对话框正常关闭
- navigationController.navigationBar 设置背景透明
- 颜色的前世今生19·外传之PPI、LPI、DPI疑难问题解答
- B-SOiD 系统运行报错全记录