当前位置: 代码网 > 服务器>软件设计>开源 > K8S简介和安装部署详细教程

K8S简介和安装部署详细教程

2024年07月31日 开源 我要评论
Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。

目录

一、k8s简介

kubernetes集群组件逻辑图

master节点组件及功能

slave节点组件及功能

          安装部署

二进制包

kubeadm工具

二、准备工作

软硬件要求

集群规划

环境配置

修改hosts配置

配置ssh免密登录

关闭swap分区

禁用selinux

关闭防火墙

修改内核参数

配置集群时钟同步

配置k8s的yum源

三、安装docker

四、安装k8s集群

安装三大组件-kubeadm、kubelet、kubectl

初始化k8s集群

加入节点

安装网络插件

五、测试k8s集群

创建nginx pod

对外暴露访问

访问nginx

六、安装dashboard

通过kubectl命令安装

创建访问账号

获取token

登录界面


一、k8s简介

kubernetes中文官网:kubernetes

github:github.com/kubernetes/kubernetes

kubernetes简称为k8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于google 集群管理工具borg。

kubernetes集群组件逻辑图

k8s集群属于master-slave主从架构,master节点负责集群管理和资源调度,用于运行控制平面组件(control plane components),slave节点就是工作负载节点,一般称为node节点,也叫worker节点,主要负责运行pod,一个pod里可以同时运行多个容器,而容器一般封装的就是基于dokcer打包的应用,pod英文叫豌豆荚,每个容器就像是一颗豌豆,简单来说pod就是一组容器。

master节点组件及功能

master组件
组件名称功能用途
kube-apiserver负责处理接受请求。
etcd高可用键值存储,用于k8s集群的后台数据库。
kube-scheduler负责选择worker节点运行新创建的pod,需要考虑的因素包括资源需求,软硬件及策略约束,亲和性和反亲和性规范、数据位置等。

kube-controller-manager

负责运行不同类型的控制器进程,每个控制器都是一个单独进程,常见的控制器有节点控制器(node controller)、任务控制器(job controller)、端点分片控制器(endpointslice controller)、服务账号控制器(serviceaccount controller)等。

cloud-controller-manager

用于嵌入特定的云平台的控制器。

slave节点组件及功能

slave组件
组件名称功能用途

kubelet

负责管理node节点上容器的健康运行,通过接收一组podspecs来实现,每个node节点上都会运行一个kubelet,不会管理不是由 kubernetes 创建的容器。

kube-proxy

负责node节点上的网络代理,用于维护网络规则,这些规则允许从集群内部或外部与pod进行网络通信,每个node节点上都会运行一个kube-proxy,k8s的service就是利用该组件实现的。

container runtime

负责管理容器的执行和生命周期。支持多种类型的容器运行时环境,比如

containerd、 cri-o及cri自定义实现,k8s使用容器运行时接口(cri)和用户选择的容器运行时交互。

安装部署

生产环境部署k8s主要有两种方式:

二进制包

github下载稳定版的二进制包,手动部署每个组件组成k8s集群。

kubeadm工具

使用kubeadm工具可以快速搭建一个k8s集群,主要包括初始化控制平面节点和加入worker节点,提供的主要功能如下:

  • kubeadm init:初始化一个master节点
  • kubeadm join:将worker节点加入集群
  • kubeadm upgrade:升级k8s版本
  • kubeadm token:管理 kubeadm join 使用的令牌
  • kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
  • kubeadm version:打印 kubeadm 版本
  • kubeadm alpha:预览可用的新功能

二、准备工作

软硬件要求

  • linux操作系统,ubuntu 或 centos
  • 每台节点至少2g
  • master节点至少2c
  • 集群节点网络互通

集群规划

软件环境
操作系统

centos linux release 7.9.2009 x86_64

dockerv24.0.6
k8sv1.20.9
kubeadmv1.20

节点配置
主机角色ipcpu内存
node1master

192.168.5.10

16c40g
node2node

192.168.5.11

16c40g
node3node

192.168.5.12

16c40g

环境配置

修改hosts配置

配置所有节点的ip和域名映射

# vim /etc/hosts
192.168.5.10 node1
192.168.5.11 node2
192.168.5.12 node3

配置ssh免密登录

先生成公钥对,再把公钥远程复制到所有节点。

[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id node1
[root@node1 ~]# ssh-copy-id node2
[root@node1 ~]# ssh-copy-id node3
[root@node1 ~]# ssh node2
last login: mon oct  2 17:18:39 2023 from 192.168.5.117

关闭swap分区

kubelet要求必须禁用交换分区,所以kubeadm初始化时回检测swap是否关闭,如果没有关闭会报错,如果不想关闭安装时命令行可以指定-ignore-preflight-errors=swap,关闭swap分区在所有节点上执行如下命令:

# 临时关闭,重启恢复
[root@node1 ~]# swapoff -a
# 永久关闭
echo vm.swappiness = 0 >> /etc/sysctl.conf
[root@node1 ~]# sysctl -p
[root@node1 ~]# cat /etc/fstab
/dev/mapper/centos-swap swap                    swap    defaults        0 0

禁用selinux

所有节点执行如下命令:

[root@node1 ~]# sed -i 's/selinux=enforcing/selinux=disabled/' /etc/sysconfig/selinux

关闭防火墙

所有节点执行如下命令:

[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# systemctl stop firewalld

修改内核参数


[root@node1 ~]# modprobe br_netfilter
[root@node1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@node1 ~]# tee /etc/sysctl.d/k8s.conf << eof
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
eof
# 重新加载配置
[root@node1 ~]# sysctl -p /etc/sysctl.d/k8s.conf

配置集群时钟同步

centos7默认使用chrony工具而非ntp进行时间同步,修改硬件时钟为utc,时区为本地时区,所有节点执行如下修改:

# 硬件时钟设置为utc
timedatectl set-local-rtc 0
# 设置本地时区,显示本地时间
timedatectl set-timezone asia/shanghai
# 手动加载rtc设置
hwclock --systohc
# 验证
[root@node1 ~]# timedatectl
      local time: tue 2023-10-03 11:26:44 cst
  universal time: tue 2023-10-03 03:26:44 utc
        rtc time: tue 2023-10-03 03:26:44
       time zone: asia/shanghai (cst, +0800)
     ntp enabled: yes
ntp synchronized: yes
 rtc in local tz: no
      dst active: n/a

配置k8s的yum源

国外yum源因为网络问题下载比较慢,此处修改为国内aliyun,用于安装k8s各个组件。

[root@node1 ~]# cat  /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0

三、安装docker

k8s运行需要容器运行环境,每个节点都需要安装docker,详细安装教程可参考我的另一篇博客:在centos系统中安装、体验和卸载docker_猫吃了源码的博客-csdn博客

四、安装k8s集群

安装三大组件-kubeadm、kubelet、kubectl

  • kubeadm:用来初始化k8s集群的指令。
  • kubelet:在集群的每个节点上用来启动 pod 和容器等。
  • kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源。
# 所有节点都安装
[root@node1 ~]# yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 所有节点设置开机启动
[root@node1 ~]# systemctl enable kubelet

初始化k8s集群

  • apiserver-advertise-address:apiserver监听地址
  • control-plane-endpoint:控制平面的ip地址或dns名称
  • image-repository:镜像仓库,此处为国内阿里云镜像仓库加速下载
  • service-cidr:为service分配的ip地址段
  • pod-network-cidr:为pod分配的ip地址段
# 所有节点添加
echo "192.168.5.10  cluster-endpoint" >> /etc/hosts
# 只在主节点执行
kubeadm init \
--apiserver-advertise-address=192.168.5.10 \
--control-plane-endpoint=cluster-endpoint \
--image-repository  registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16

初始化需要下载多个镜像,可能时间比较久,最终安装的镜像如下:

[root@node1 ~]# docker images
repository                                                                    tag        image id       created         size
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.9    8dbf9a6aa186   2 years ago     99.7mb
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.9    eb07fd4ad3b4   2 years ago     116mb
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.9    0d0d57e4f64c   2 years ago     122mb
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.9    295014c114b3   2 years ago     47.3mb
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   3 years ago     253mb
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   3 years ago     45.2mb
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   3 years ago     683kb

成功界面:

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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $home/.kube/config
  sudo chown $(id -u):$(id -g) $home/.kube/config

alternatively, if you are the root user, you can run:

  export kubeconfig=/etc/kubernetes/admin.conf

you 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.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
    --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad

要使非root用户运行kubectl,请执行以下命令,这也是上面kubeadm init输出的一部分: 

mkdir -p $home/.kube
sudo cp -i /etc/kubernetes/admin.conf $home/.kube/config
sudo chown $(id -u):$(id -g) $home/.kube/config

 如果是root用户,则可以执行以下命令:

export kubeconfig=/etc/kubernetes/admin.conf

记住上面输出的kubeadm join命令,下面用该命令将节点加入集群。

加入节点

所有node节点执行如下命令: 

kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
    --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad

查看token列表,可观察到每个token的剩余有效时间

[root@node1 ~]# kubeadm token list
token                     ttl         expires                     usages                   description                                                extra groups
kdy4ka.jz5otwd1l3l2of5v   7h          2023-10-03t19:46:32+08:00   authentication,signing   the default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

默认token有效期为24小时,过期之后token失效,可重新生成token:

kubeadm token create --print-join-command

修改角色:

# node节点执行
[root@node1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker
# master节点执行
[root@node1 ~]# kubectl get nodes
name    status   roles                  age   version
node1   ready    control-plane,master   16h   v1.20.9
node2   ready    worker                 15h   v1.20.9
node3   ready    worker                 15h   v1.20.9

安装网络插件

calico是一套开源的纯三层的虚拟化网络解决方案,是目前k8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把pod当做路由器上一个终端设备为其分配一个ip地址,通过bgp协议生成路由规则,实现不同节点上的pod网络互通。

# 下载calico.yaml并保存到本地
[root@node1 ~]# curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -o
修改配置
3888行             - name: calico_ipv4pool_cidr
3889行               value: "172.20.0.0/16"
# 提交
[root@node1 ~]# kubectl apply -f calico.yaml
# 验证是否成功
[root@node1 ~]# kubectl get pod -a | grep calico
kube-system            calico-kube-controllers-577f77cb5c-s6zfl     1/1     running   0          15h
kube-system            calico-node-7gsfr                            1/1     running   0          15h
kube-system            calico-node-hb2k8                            1/1     running   0          15h
kube-system            calico-node-xt4bl                            1/1     running   0          15h

五、测试k8s集群

创建nginx pod

默认会在默认命名空间default中创建一个名称为mynignx的deployment,同时会创建一个名称以myniginx为前缀,叫mynginx-5b686ccd46-wshz6的pod。

[root@node1 ~]# kubectl create deployment mynginx --image=nginx
deployment.apps/mynginx created
# 查看pod
[root@node1 ~]# kubectl get pod,svc
name                           ready   status    restarts   age
pod/mynginx-5b686ccd46-wshz6   1/1     running   0          39s

name                 type        cluster-ip   external-ip   port(s)   age
service/kubernetes   clusterip   10.96.0.1    <none>        443/tcp   17h

对外暴露访问

基于第一步创建的deployment再创建一个名叫mynginx的service,资源类型由--type=clusterip修改为--type=nodeport,会在每个node节点上监听30161端口,用于接收集群外部访问。

[root@node1 ~]# kubectl expose deployment mynginx --port=80 --type=nodeport
service/mynginx exposed
# 查看
[root@node1 ~]# kubectl get pod,svc
name                           ready   status    restarts   age
pod/mynginx-5b686ccd46-wshz6   1/1     running   0          5m24s

name                 type        cluster-ip     external-ip   port(s)        age
service/kubernetes   clusterip   10.96.0.1      <none>        443/tcp        17h
service/mynginx      nodeport    10.105.55.49   <none>        80:30161/tcp   50s

访问nginx

浏览器输入<任意一个节点ip>:<port>,都可以访问nginx首页表示测试成功。

六、安装dashboard

 k8s官方提供了一个简单的dashboard,主要提供工作负载,服务,配置和存储,集群等管理功能。

github:github.com/kubernetes/dashboard

通过kubectl命令安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

对外暴露访问端口,由--type=clusterip修改为--type=nodeport

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

查看service

[root@node1 ~]# kubectl get svc -a|grep dashboard
kubernetes-dashboard   dashboard-metrics-scraper   clusterip   10.102.247.36   <none>        8000/tcp                 16h
kubernetes-dashboard   kubernetes-dashboard        nodeport    10.96.38.129    <none>        443:31128/tcp            16h

浏览器输入访问地址:https://192.168.5.10:31128/,需要token才能访问。

创建访问账号

[root@node1 ~]# vim dashboard-token.yaml
apiversion: v1
kind: serviceaccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---

apiversion: rbac.authorization.k8s.io/v1beta1
kind: clusterrolebinding
metadata:
  name: admin-user
roleref:
  apigroup: rbac.authorization.k8s.io
  kind: clusterrole
  name: cluster-admin
subjects:
- kind: serviceaccount
  name: admin-user
  namespace: kubernetes-dashboard
[root@node1 ~]# kubectl apply -f dashboard-token.yaml
serviceaccount/admin-user created

获取token

[root@node1 ~]# kubectl get secret -n kubernetes-dashboard
name                               type                                  data   age
admin-user-token-vfj8s             kubernetes.io/service-account-token   3      10s
default-token-w8jgn                kubernetes.io/service-account-token   3      15m
kubernetes-dashboard-certs         opaque                                0      15m
kubernetes-dashboard-csrf          opaque                                1      15m
kubernetes-dashboard-key-holder    opaque                                2      15m
kubernetes-dashboard-token-xjt6l   kubernetes.io/service-account-token   3      15m
# 查看名为admin-user-token-vfj8s的secret
[root@node1 ~]# kubectl describe secret admin-user-token-vfj8s -n kubernetes-dashboard
name:         admin-user-token-vfj8s
namespace:    kubernetes-dashboard
labels:       <none>
annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 36b4e5f5-2f46-488d-960c-899cb4309d50

type:  kubernetes.io/service-account-token

data
====
ca.crt:     1066 bytes
namespace:  20 bytes
token:      eyjhbgcioijsuzi1niisimtpzci6ikhmmxfcmgvavhvrv0hhamptrexxdhlmcjbvtvlxrhd0vl9hc29lsxu0tg8ifq.eyjpc3mioijrdwjlcm5ldgvzl3nlcnzpy2vhy2nvdw50iiwia3vizxjuzxrlcy5pby9zzxj2awnlywnjb3vudc9uyw1lc3bhy2uioijrdwjlcm5ldgvzlwrhc2hib2fyzcisimt1ymvybmv0zxmuaw8vc2vydmljzwfjy291bnqvc2vjcmv0lm5hbwuioijhzg1pbi11c2vylxrva2vulxzmajhziiwia3vizxjuzxrlcy5pby9zzxj2awnlywnjb3vudc9zzxj2awnllwfjy291bnqubmftzsi6imfkbwlulxvzzxiilcjrdwjlcm5ldgvzlmlvl3nlcnzpy2vhy2nvdw50l3nlcnzpy2utywnjb3vudc51awqioiiznmi0ztvmns0yzjq2ltq4ogqtotywyy04otljyjqzmdlkntailcjzdwiioijzexn0zw06c2vydmljzwfjy291bnq6a3vizxjuzxrlcy1kyxnoym9hcmq6ywrtaw4tdxnlcij9.zoe_jz20jf3imll9bwtmk5vm7y_vacri3zatbad8ipdsdv7ccbje9edrvtq-l86hou0qb_sa3hhqo0wtgagfavhahhjanlcr-maourwmiylg8a2k07ot_5qr9bjc-xxfym25soc04cyj-z86-lsecsbiklhuwsxxszaqkupmd471mmo-_jl-fwaj-3jdz8e4uamd-mhjrkyorqmgorxpjxpgwkzd2prprhoiaunbxigo6qwhongimitjfcw77or32tbpiduxy94j64twvjyvdbmygq1j0weozjfobdnbym6brgdjp86f_p-dytxwsfojhbavycgpdcqyo_dimtg8_g

登录界面

输入上面的token,进入dashboard首页

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com