使用kubeadm快速部署一个k8s集群

2023-09-13 18:27:45

0. 前置准备

准备好3台服务器,一台作为master,另外两台作为worker节点。 3台服务器网络互通,os是centos-7.9

1. 设置服务器操作

  • 关闭服务器防火墙:systemctl stop firewalld
  • 永久关闭selinux:sed -i 's/enforcing/disabled/' /etc/selinux/config
  • 关闭swap:swapoff -a
  • 设置主机名:hostnamectl set-hostname myk8s-master(三台服务器都分别设置)
  • 在master上设置worker的解析。
    • cat >> /etc/hosts << EOF 192.168.32.128 k8s-master 192.168.32.129 k8s-node1 192.168.32.130 k8s-node2 EOF
  • 将桥接的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

2. 安装docker

# 安装docker
yum install -y yum-utils
yum-config-manager \
    --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker

3. 安装docker-compose(非必须)

 curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 国内可以选择这个地址
# curl -L https://download.fastgit.org/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 添加可执行权限
chmod +x /usr/local/bin/docker-compose

4.安装kubeadmin、kubectl和kubelet

--添加yum的k8s源

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/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF 

-- yum安装

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

-- 启动kubeadmin

systemctl enable kubelet

查看安装包:

rpm -qa | grep kube

kubelet --version

kubeadm version 

kubectl version

手动下载镜像:

-- 查看仓库下镜像

kubeadm config images list --image-repository registry.aliyuncs.com/google_containers

-- pull 镜像

 kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

-- docker images

5. 初始化master

创建配置文件kubeadm-init.yaml文件,具体的参数介绍可见:kubeadm init | Kubernetes

kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --apiserver-advertise-address 172.16.242.129 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.1.0.0/16  --ignore-preflight-errors=all

命令中的各选项简单说明如下:

  • --image-repository:指定要使用的镜像仓库,默认为gcr.io;

  • --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;

  • --control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;

  • --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;

  • --service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;

  • --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;

  • --token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。

遇到错误:

9月 12 19:14:54 myk8s-master kubelet[25047]: E0912 19:14:54.390257   25047 kubelet.go:2267] node "myk8s-master" not found

9月 12 19:14:54 myk8s-master kubelet[25047]: W0912 19:14:54.410219   25047 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d

解决办法:

-- 首先恢复原始初始化状态

kubeadm reset --force 

-- 卸载 版本

 yum remove -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

-- 解决CNI缺失问题

可以暂时不处理,等后续安装CNI插件即可。

6.在master节点使kubectl生效

直接使用kubectl get nodes,会出现权限错误。

The connection to the server localhost:8080 was refused - did you specify the right host or port?

-- 解决方案

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

-- 这个使用,看到的节点的状态是notready。需要安装CNI网络插件

7. 安装网络插件Calico

-- 执行命令

kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

-- 看到有calico-node和calico-kube-controllers pods启动成功后,表示CNI插件网络安装好了。

8. 让主节点参与调用

默认情况下,主节点不参与pod调用,在集群资源有限的情况下,可以主动去掉主节点的标记,让其参与调用。

kubectl taint nodes --all node-role.kubernetes.io/master-

9. worker节点加入集群

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
-- 可以再master节点执行命令得到

# 如果没有token,请使用命令kubeadm token create 创建
kubeadm token list

-- 在master查看hash值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \

>    openssl dgst -sha256 -hex | sed 's/^.* //'

 10. 创建一个pod验证

先介绍pod和deployment的区别:

Pod和Deployment都是Kubernetes API中的完整对象。Deployment通过ReplicaSet管理创建Pod。它归结为Deployment将使用模板中的规范创建Pod。

一定要先确定集群支持的版本,可通过命令kubectl api-versions

apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
    labels:
        app: nginx
    namespace: default
spec:
    replicas: 2
    selector: 
        matchLabels:
            app: nginx
    template:
        metadata:
            labels: 
                app: nginx
        spec:
            containers:
            - name: nginx
              image: nginx:1.7.9
              resources:
                requests:
                    cpu: "0.3"
                    memory: 200Mi
                limits:
                    cpu: "0.5"
                    memory: 300Mi
              ports:
              - containerPort: 80

11. 跨版本升级一个k8s集群

1) 要升级哪些内容

  • 控制面板节点
  • worker nodes
    • kubeadm
    • kubelet
    • kubectl

2)升级master node

-- 查看版本信息

kubeadm version -o json

-- 查看升级计划, 确认是否需要夸版本升级

kubeadm upgrade plan

-- 查看可升级的版本

yum list --showduplicates kubeadm --disableexcludes=kubernetes
-- 安装kubeadm 到需要的版本

yum install kubeadm-v1.19.12

-- 升级kubeadm

kubeadm upgrade apply v1.19.12

-- 驱除节点上的负载,

kubectl drain myk8s-master --ignore-daemonsets

-- 如果是本地存储,还需要删除本地存储

kubectl drain myk8s-master --ignore-daemonsets --delete-local-data

-- 升级kubelet和kubectl

yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes
-- 重启服务

systemctl daemon-reload

systemctl restart kubelet

-- 恢复可被调度

kubectl uncordon myk8s-master

-- 查看升级信息

 

3)升级worker节点

-- 下载安装信息 

yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes

-- 升级信息

kubeadm upgrade node

-- 驱逐节点

kubectl drain worker-node1 --ignore-daemonsets

-- 重启并恢复调度

systemctl daemon-reload

systemctl restart kubelet

kubectl uncordon worker-node1

 12. 高可用k8s集群

因为k8s本身worker节点是多个,并且是无状态的,天然存在可用性保证。 所以集群的高可用落地到master集群。 

第一种模式:master和分布式数据库etcd部署在一起。

第二种模式:etcd和master分开部署

 

 

更多推荐

python正则表达(06)

python正则表达(06)文章目录python正则表达(06)1正则表达式概念2正则的三个基础方法2.1match、search、findall三个基础方法2.2re.match()函数2.2.1re.match(匹配规则,被匹配字符串)2.2.2验证是否开头匹配,match是匹配开头,后面的是不匹配2.3re.se

SpringCloud Eureka搭建会员中心服务提供方-集群

😀前言本篇博文是关于SpringCloudEureka搭建会员中心服务提供方-集群,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进的地方

Java基于微信小程序的电影交流平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录第一章:简介第二章、开发环境:后端:前端:数据库:三、系统详细设计3.4.1数据库概念结构设计第四章系统功能的具体实现4.1小程序端4.2管理员

java基于微信小程序的讲座预约系统的研究与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录1简介2技术栈第三章系统分析3.1初步需求分析3.2系统用例分析3.2.1公告管理用例分析3.2.2系统管理用例分析3.2.3学生信息用例分析3

MyBatis快速入门

Mybatis概述Mybatis概念MyBatis是一款优秀的持久层框架,用于简化JDBC开发MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github官网:ht

nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

Android9底部导航栏出现空白按钮问题分析

Android9底部导航栏出现空白按钮问题分析底部导航栏的初始化进入NavigationBarView初始化:进入NavigationBarView的onFinishInflater进入NavigationBarInflaterViewNavigationBarInflaterView加载单个的button回到Navi

XUI - 一个简洁而优雅的Android原生UI框架

官网GitHub-xuexiangjys/XUI:💍AsimpleandelegantAndroidnativeUIframework,freeyourhands!(一个简洁而优雅的Android原生UI框架,解放你的双手!)XUI|💍AsimpleandelegantAndroidnativeUIframewor

【算法】相向双指针

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kuan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kaf

NSSCTF web 刷题记录2

文章目录前言题目[广东强网杯2021团队组]love_Pokemon[NCTF2018]Easy_Audit[安洵杯2019]easy_web[NCTF2018]全球最大交友网站prize_p2[羊城杯2020]easyser[FBCTF2019]rceservice方法一方法二[WUSTCTF2020]颜值成绩查询前

SpringCLoud——服务的拆分和远程调用

服务拆分服务拆分注意事项一般是根据功能的不同,将不同的服务按照功能的不同而分开。微服务拆分注意事项不同微服务,不要重复开发相同业务微服务数据独立,不要访问其他微服务的数据库微服务可以将自己的业务暴露为接口,供其他微服务调用远程调用对于远程调用,之前我们说过,微服务之所以不能像单个服务那样互相的调用各自服务的信息,是因为

热文推荐