K8S部署

环境规划

1.集群类型:一主多从

2.安装方式:使用kubeadm工具快速搭建kubernetes集群。

3.主机规划:

 

角色 IP地址 实验环境  主机名

Master 192.168.128.129 Centos7.虚拟机   k8s-master

Node1 192.168.128.130 Centos7.虚拟机   k8s-node1

Node2 192.168.128.131 Centos7.虚拟机   k8s-node2

 

安装环境准备

每个节点(三台机器)

实验环境下机器的系统版本为7.9,内核版本为3.10.0

查看系统版本

cat /etc/redhat-release

查看当前系统的内核:

uname -sr

 

 

默认的 3.10.0版本较低,安装最新主线内核版本

CentOS 7.x 上启用 ELRepo 仓库:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

 

查看可用的系统内核相关包:

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

                        

安装最新主线内核版本:

yum -y --enablerepo=elrepo-kernel install kernel-ml

 

设置默认的内核版本:

#修改GRUB_DEFAULT=0,设置为0表示默认启动第一个操作系统或内核,从0开始计数

vi /etc/default/grub

 

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

GRUB_DEFAULT=0 # 修改此处,原来是 saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"

GRUB_DISABLE_RECOVERY="true"

 

重新创建内核配置

grub2-mkconfig -o /boot/grub2/grub.cfg

 

查看默认内核

grubby --default-kernel

 

若不是最新的,使用以下命令设置,reboot重启生效。

grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo)

 

 

设置主机名和hosts本地解析

hostnamectl set-hostname k8s-master    #192.168.128.129

hostnamectl set-hostname k8s-node1    #192.168.128.130

 

所有节点编辑/etc/hosts文件,添加:

vi /etc/hosts

127.0.0.1   k8s-master

192.168.128.129 k8s-master

192.168.128.130 k8s-node1

 

 

在每个节点(三台机器)上都关闭防火墙,并设置开机禁用

systemctl stop firewalld && systemctl disable firewalld

setenforce 0

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

 

查看防火墙状态

systemctl status firewalld

getenforce

cat /etc/selinux/config

 

从指定的NTP服务器获取时间信息,并将本地系统时间设置为该服务器时间

yum install ntpdate -y

ntpdate time.windows.com

 

当内存不足时,linux会自动使用swap,将部分内存数据存放到磁盘中。swap会导致docker的运行不正常,性能下降,还可能产生其他问题,因此部署k8s集群时一定要关闭swap分区。在每个节点上都进行以下操作:

#所有节点关闭swap交换分区

sed -ri 's/.*swap.*/#&/' /etc/fstab

swapoff -a && sysctl -w vm.swappiness=0

 

#查看是否关闭(swap 0 0 0则成功关闭)

free -m

 

 

将桥接的IPv4流量传递到iptables链

cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

vm.swappiness = 0

EOF

 

#加载br_netfilter模块

modprobe br_netfilter

 

#查看是否加载

lsmod | grep br_netfilter

 

#使生效

sysctl --system

 

#拓展:持久化修改(保留配置包本地文件,重启系统或服务进程仍然有效)

sysctl -p

 

开启 ipvs

#在三台机器安装 ipset ipvsadm

yum -y install ipset ipvsadm

 

#在每个节点执行如下脚本:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack

EOF

 

#授权、运行、检查是否加载:

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

 

重启机器

reboot

 

容器化环境和组件安装

安装docker

#卸载旧版本docker(如有)

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

 

# yum安装 gcc 相关软件,安装yum工具包

yum -y install gcc gcc-c++

yum -y install yum-utils

 

#设置阿里云的stable 镜像仓库

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 

#更新 yum 软件包索引

yum makecache fast

 

#安装指定版本的 Dockerv20.10.8:

yum -y install docker-ce-3:20.10.8-3.el7.x86_64 docker-ce-cli-1:20.10.8-3.el7.x86_64 containerd.io

 

#启动docker并设置开机自启

systemctl start docker

systemctl enable docker

 

#验证 Docker 是否安装成功:

systemctl status docker

docker -v

 

 

配置docker镜像加速器

为了下载各组件时从国内镜像源下载,在每个节点上都需要配置镜像加速器。

mkdir -p /etc/docker

 

#配置阿里云镜像加速:

tee /etc/docker/daemon.json <<-'EOF'

{

  "exec-opts": ["native.cgroupdriver=systemd"], 

  "registry-mirrors": [

    "https://du3ia00u.mirror.aliyuncs.com",

    "https://hub-mirror.c.163.com",

    "https://mirror.baidubce.com",

    "https://registry.docker-cn.com"

  ],

  "live-restore": true,

  "log-driver":"json-file",

  "log-opts": {"max-size":"500m", "max-file":"3"},

  "max-concurrent-downloads": 10,

  "max-concurrent-uploads": 5,

  "storage-driver": "overlay2"

}

EOF

 

#使之生效并重启docker

systemctl daemon-reload

systemctl restart docker

 

添加阿里云的YUM软件源

由于kubernetes的镜像源在国外,下载软件包较慢或者下载失败,这里在每个节点上都切换成国内的阿里云镜像源。

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 clean all

yum makecache

yum list

 

安装kubeadmkubeletkubectl

在每个节点(3台机器)上都需要安装kubeadmkubeletkubectl,安装时指定版本为1.21.10

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

Kubelet:运行在cluster(集群)所有节点上,负责启动POD和容器。

kubectlKubernetes集群的命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。

安装三大组件

yum install -y kubelet-1.21.10 kubeadm-1.21.10 kubectl-1.21.10

 

#查看安装版本:

kubelet --version

 

为了实现Docker使用的cgroup drvierkubelet使用的cgroup drver一致,修改"/etc/sysconfig/kubelet"文件为以下内容:

vi /etc/sysconfig/kubelet

# 修改为

KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

KUBE_PROXY_MODE="ipvs"

 

设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:

systemctl enable kubelet

 

kubernetes集群部署

下载k8s所需镜像

在每个节点(3台机器)上都安装好k8s集群所需的镜像

查看 Kubernetes 安装所需镜像

kubeadm config images list

下载 Kubernetes 安装所需镜像

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.10

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.10

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.10

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.10

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.0

查看镜像下载情况

docker images

 

部署 Kubernetes 的 Master 节点

 

192.168.128.129 机器上部署 Kubernetes Master 节点:

kubeadm init \

  --apiserver-advertise-address=192.168.128.129 \

  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \

  --kubernetes-version=v1.21.10 \

  --service-cidr=10.96.0.0/16 \

  --pod-network-cidr=10.244.0.0/16

 

 

 

#创建目录存放 Kubernetes 的配置文件并配置 Kubernetes 客户端工具 kubectl

mkdir -p $HOME/.kube

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

 

#$HOME/.kube/config 文件的权限修改为当前用户

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

 

# 如果是 root 用户,可以执行如下命令,在使用 kubectl 命令时就不需要每次都指定配置文件的路径

export KUBECONFIG=/etc/kubernetes/admin.conf

 

 

#生成token,有效期2小时

kubeadm token create --print-join-command

 

# 生成一个永不过期的token

kubeadm token create --ttl 0 --print-join-command

 

#此时系统自动生成了一个kubeadm join命令,这个命令是用来将一个新的节点加入到 Kubernetes 集群中的。说明:

kubeadm join 192.168.128.129:6443   ----集群的 API Server 地址

--token qn8ruc.lgsc3w7t9mk7oa36     ----用来认证新节点的凭证

--discovery-token-ca-cert-hash sha256:c02e3bfab11fc886e72fc2439a1b4e2e1151fa48a21a15416ca10806161c1309

 

部署 Kubernetes 的 Node节点

node节点加入到kubernetes集群中

kubeadm join 192.168.128.129:6443 \

    --token qn8ruc.lgsc3w7t9mk7oa36 \

    --discovery-token-ca-cert-hash \

 sha256:c02e3bfab11fc886e72fc2439a1b4e2e1151fa48a21a15416ca10806161c1309

 

部署网络插件

Kubernetes本身并没有自己实现容器网络,而是借助CNI标准,通过插件化的方式来集成各种网络插件,实现集群内部网络相互通信。

 

Kubernetes集群设计了Cluster IPNode IPPod IP三种类型的通信IP

 

1Cluster IPService对象的IP地址,实现Pod服务的负载均衡,外部网络无法ping通,只在集群内部可以访问使用,是一个虚拟的IP

2Node IP是集群节点NodeIP地址,可以是物理机的IP(也可能是虚拟机IP)。

3Pod IP是容器组PodIP地址,是在容器组初始化过程由Pause容器申请的IP地址。其中Pod IP是容器网络接口CNI与具体的网络插件来实现IP的申请及数据包的转发。

 

 

Kubernetes 支持多种网络插件,比如 flannelcalicocanal 等,任选一种安装即可,这里选择 calico。在 master节点(192.168.128.129 )上执行:

 

kubectl apply -f https://projectcalico.docs.tigera.io/v3.19/manifests/calico.yaml

 

 

查看部署 CNI 网络插件进度:

kubectl get pods -n kube-system

#或者

watch kubectl get pods -n kube-system

 

设置 kube-proxy 的 ipvs 模式

Master节点(192.168.128.129)上设置 kube-proxy ipvs 模式:

kubectl edit cm kube-proxy -n kube-system

 

删除 kube-proxy ,让 Kubernetes 集群自动创建新的 kube-proxy

kubectl delete pod -l k8s-app=kube-proxy -n kube-system

 

配置Node节点也能使用 kubectl 命令

默认情况下,只有 Master 节点才有 kubectl 命令,但是有些时候我们也希望在 Node 节点上执行 kubectl 命令。

 

 

 

服务部署

Kubernetes集群中部署nginx1.14,测试下集群是否正常工作

部署Nginx

kubectl create deployment nginx --image=nginx:1.14-alpine

暴露端口:

kubectl expose deployment nginx --port=80 --type=NodePort

查看服务状态:

kubectl get pods,svc

自动补全

# 安装bash

yum -y install bash-completion

# 自动补全

echo 'source <(kubectl completion bash)' >>~/.bashrc

kubectl completion bash >/etc/bash_completion.d/kubectl

# 全局

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null

source /usr/share/bash-completion/bash_completion

 

安装K8s-Dashboard

Dashboard 是基于网页的 Kubernetes 用户界面。可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。我们可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 DeploymentJobDaemonSet 等等)。常用的如对Deployment实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用,展示Kubernetes集群中的资源状态信息和所有报错信息等。

 

使用 wget 命令将dashboard(这里版本为2.0.4)下载到Master 节点上:

kubectl apply -f https://kuboard.cn/install-script/k8s-dashboard/v2.0.0-beta5.yaml

 

GitHub上的项目的有些资源是放在raw.githubusercontent.com上的,通常我们在安装某些软件的时候会从该地址下载资源,直接访问的话经常容易失败

分析原因:因为神秘力量,域名解析不了,所以访问不了。

解决方法:不用域名登录,直接用ip登录,或者去/etc/hosts里设置下域名解析

我们利用查询网查询,查询网的地址为:https://www.ip138.com

echo "185.199.109.133  raw.githubusercontent.com" >> /etc/hosts

 

构建 Pod

kubectl apply -f recommended.yaml

 

查看 Pod 状态,等待一段时间,已经处于running状态。

kubectl get pods --all-namespaces | grep dashboard

 

删除现有的 dashboard 服务

dashboard 服务的 namespace kubernetes-dashboard,但是该服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要在后面配置 NodePort 类型的,使之在集群外部能否访问。

#查看所有命名空间namespace

kubectl get svc --all-namespaces

 

#删除现有dashboard服务

kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard

 

登录dashboard

配置文件放在:/etc/Kubernetes

k8s所有证书的存放位置:/etc/kubernetes/pki

环境变量(env)存放的位置:/var/lib/kubelet/kubeadm-flags.env

kubelet配置文件存放位置:/var/lib/kubelet/config.yaml

 

创建一个nodePort类型的kubernetes-dashboard。进入/etc/kubernetes 目录下创建配置文件dashboard-svc.yaml

vi /etc/kubernetes/dashboard-svc.yaml

 

kind: Service

apiVersion: v1

metadata:

  labels:

    k8s-app: kubernetes-dashboard

  name: kubernetes-dashboard

  namespace: kubernetes-dashboard

spec:

  type: NodePort

  ports:

    - port: 443

      targetPort: 8443

  selector:

k8s-app: kubernetes-dashboard

 

 

创建kubernetes-dashboardService服务:

kubectl apply -f dashboard-svc.yaml

 

创建 kubernetes-dashboard 管理员角色,在/etc/kubernetes 目录下创建配置文件dashboard-svc-account.yaml,其内容如下

vi /etc/kubernetes/dashboard-svc-account.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

  name: dashboard-admin

  namespace: kube-system

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

  name: dashboard-admin

subjects:

  - kind: ServiceAccount

    name: dashboard-admin

    namespace: kube-system

roleRef:

  kind: ClusterRole

  name: cluster-admin

  apiGroup: rbac.authorization.k8s.io

 

同样的执行创建,使该yaml文件生效

kubectl apply -f dashboard-svc-account.yaml

 

获取 token,先查找token文件

kubectl get secret -n kube-system |grep admin|awk '{print $1}'

 

#系统返回dashboard-admin-token-bvhwm,查看token

kubectl describe secret dashboard-admin-token-xz2p6 -n kube-system|grep '^token'|awk '{print $2}'

 

此时我们得到了dashboardtoken,先复制保存一份

eyJhbGciOiJSUzI1NiIsImtpZCI6ImVtUGFuLW1WNGtiU2xiWHNnZmhaTE1zQVl6dDhoeXJod1dfUGRCcFp4S2MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4teHoycDYiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjQzYTA3NDctMjA3MC00NTEwLThhNWUtZTg1ZjBjYmRhMTM3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Ugdf9l_BCSo4wLFIuMT820F5nSsmHpHy_Ya_FqV1WT5wN2ZdJUmBAhn5vO6PVM0UivD-8n58Fs0Hatj-qKKJ-LlxuSeRZRBjk5rUI6ni7Z9FbM-NbXisr84TpXlPvzKFHeuyBqpoU6Sxd0QWbEfaKKrldckc4ESHWlE_-PtzQljID7K9UgSn50Vz9NWHP_2qFDXtZpoouWVD17DxSQShlEETIjxuClDzTHfLG-bho2sWDD-HAKrW3o5_ZkqmucFiqQUO5O3OvqzL3kG5D6Aav4SgJrrYr1QWh8Ewqfpz029aT4Ycs5Hg744u_hgy7F05QT-a-jIOez6P6D2S0tXYtQ

 

查看外部访问端口,也就是之前我们创建的 Service

 

kubectl get svc --all-namespaces | grep dashboard

 

posted @ 2025-03-28 09:13  lihuimin222  阅读(67)  评论(0)    收藏  举报