k8s --- 环境搭建

1. 准备工作

1. 安装流程

2. 准备流程

1. 准备 3 个服务器,且保证这三台服务器能相互ping通

3. 安装须知

  • 一台内容的 Linux 主机. Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的命令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响应用的运行内存)
  • 2 CPU 核心或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网或内网都可以)
    • 设置防火墙放行规则
  • 节点之中不可以有重复的主机名、MAC 地址、product_uuid
    • 设置不同的hostname
  • 开启机器上的某些端口
    • 内网互信
  • 禁用交换分区,为了保证 kubelet 正常工作, 你必须禁用交换分区
    • 永久关闭

2. 创建集群

1. 三台机器安装 Docker(-20.10.7)

1. 切换yum源

sudo yum install -y yum-utils

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

**2. 安装 Docker **

sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

3. 启动 Docker

systemctl enable docker --now

4. 检查是否安装成功

docker info

5. 配置镜像加速

sudo mkdir -p /etc/docker  # docker默认加载这个文件

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts":{
  	"max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2. 三台机器的环境设置

1. 全部设置具有描述意义的主机名

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

检查主机名是否修改完成

hostname

xshell 重新创建与服务器的连接,即可看到主机名在命令行上的修改

2. 禁用 SELinux (相当于Linux的安全设置)

# 两条命令一起执行
sudo setenforce 0   # 临时禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive' /etc/selinux/config   # 永久禁用

3. 关闭 swap

# 两条命令一起执行
swapoff -a  # 临时禁用
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久禁用

检查是否关闭成功

free -m

4. 允许 iptables 检查桥接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

5. 使以上的配置生效

sudo sysctl --system

3. 三台机器安装 kubelet、kubeadm、kubectl

1. 设置 kubernetes 的 yum 源地址

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyu.com/kubernetes/yum/repos/kubernetes-el17-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyu.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyu.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

2. 开始下载

sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

3. 启动kubelet

sudo systemctl enable --now kubelet

4. 检查 kubelet 状态

systemctl status kubelet

kubelet 启动后,多查看几次状态会发现其每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环,此现象是正确的

5. 三台机器的端口放行 30000-32767 端口

4. 使用 kubeadm 引导集群

1. 三台机器执行下面脚本,下载所需要的镜像

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ;do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF

配置images.sh的可执行权限,并执行

chmod +x ./images.sh  && ./images.sh

2. 三台机器都添加 master 域名映射

# 172.31.0.2为master节点IP,设置master节点为整个集群的入口节点(端点),cluster-endpoint 为master节点的域名
echo "172.31.0.2 cluster-endpoint" >> /etc/hosts  

检查各个机器 ping域名是否可以ping通

ping cluster-endpoint

3. 主节点初始化

1. 在主节点执行

# 注意: 所有的网络范围不允许重叠
kubeadm init \
--apiserver-advertie-address=172.31.0.2 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

参数详解

  1. --service-cidr : k8s集群内部对于大量请求进行负载均衡的时候使用的网段,
  2. --pod-network-cidr: k8s给其内部 pod 分配网络的网络段

2. 执行成功后的提示信息,并复制红框以下的内容,进行保存,以后要用

3. 执行上面图中的三条命令,创建目录

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

4.查看集群中的所有节点

kubectl get nodes

5. 在 msater 节点运行命令,部署网络组件

curl https://docs.projectcalico.org/manifests/calico.yaml -o

# 应用这个文件
kubectl apply -f calico.yaml

4. 加入Node节点

在其他机器上执行下面的加入新的Node节点命令,后面的令牌串24小时内有效

令牌过期了可以在 master节点 使用下面的命令创建新的令牌,然后复制后再其他Node节点执行即可以 Node节点 加入集群

kubeadm token create --print-join-command

可以在主节点查看当前集群的所有节点,等待所有的应用都是Running状态,且Ready 变为1 就可以了

kubectl get nodes

5. 集群自我恢复

# Linux重启命令
rboot

# 重启完成后,集群自动恢复
kubectl get nodes
kubectl get pods -A

3. 部署 dashboard 可视化界面

5.1 官网

https://github.com/kubernetes/dashboard

5.2 安装

1. 下载 dashboard 配置文件

# 下载wget命令
yum install -y wget

# 下载配置文件,如果下载不成功,直接访问外网后将文件拷贝下来
wget https://raw.githubsercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

# 根据配置文件创建应用
cubectl apply -f ./recommended.yaml

2. 设置访问端口

1. master节点运行以下命令,type:ClusterIP 改为 type:NodePort,用来暴露端口在主机上

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

# 然后在最后一行敲 /type
# 输入i,进入插入模式
# 改为 type:NodePort

2. 执行下面命令找到web网页的端口

kubectl get svc -A | grep kubernetes-dashboard

3. 在安全组开放上图的端口

4. 浏览器访问,主节点或Node节点IP都可以访问的到

https://139.198.161.34:30753

3. 创建访问账号

vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
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

根据配置文件创建资源

kubectl apply -f dash.yaml

4. 获取令牌

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}}") -o go-template="{{.data.token | base64encode}}"

5.3 保存令牌到文本中

复制得到的令牌,进web页进行访问

5.4 使用

1. 创建 Pod

需要指定名称空间

1. web页面切换名称空间

2. 配置文件指定名称空间

apiVersion: v1
kind: Pod
metadata:
  labels: 
    run: mynginx
  name: mynginx   
  namespace: default  # 指定名称空间
spec:  
  containers: 
  - image: nginx   
    name: mynginx 

2. 查看 Pod

3. 创建 Deployment

4. 查看 Deployment

4. k8s_1.20 + kubeSphere_3.11 整体环境安装

1. 准备工作

  1. 选择4核8G(master)、8核16G(node1)、8核16G(node2) 三台机器,Linux版本为CentOS7.9,按需付费进行实验
  2. 安装Docker
  3. 安装kubernetes
  4. 安装kubeSphere前置环境
  5. 安装kubeSphere

2. 三台机器 安装 Docker

复制代码,命令行粘贴即可一键安装配置,或者做成 shell 脚本

docker_install.sh

# 删除之前安装的Docker环境
sudo yum remove docker*

# 安装yum工具
sudo yum install -y yum-utils

# 配置 Docker 的 yum 地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aiyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装指定版本
sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

# 启动及开机自启动
systemctl enable docker --now

# 配置镜像加速
sudo mkdir -p /etc/docker  # docker默认加载这个文件

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts":{
  	"max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

检查是否安装成功

docker ps

3. 三台机器 安装 kubernetes

0. 架构为 1 master 2 node

1. 三台机器 分别 设置 host name,不能用localhost

master 节点

hostnamectl set-hostname k8s-master

node1 节点

hostnamectl set-hostname k8s-node1

node2 节点

hostnamectl set-hostname k8s-node2

2. 检查是否设置完成

hostname

xshell 重新创建与服务器的连接,即可看到主机名在命令行上的修改

3. 三台机器全部运行下面命令

# 将SELinux 设置为 permissive模式 (相当于禁用)
sudo setenforce 0   # 临时禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive' /etc/selinux/config   # 永久禁用

# 关闭swap
swapoff -a  # 临时禁用
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久禁用

# 允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# 使以上的配置生效
sudo sysctl --system

4. 注意替换下面的 master IP 地址,三台机器安装 kubelet、kubeadm、kubectl

# 配置 kubernetes 的 yum 源地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyu.com/kubernetes/yum/repos/kubernetes-el17-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyu.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyu.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# 安装 1.20.9 kubelet、kubeadm、kubectl
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

# 启动kubelet
sudo systemctl enable --now kubelet

# 注意替换 master的IP地址
echo "master的IP地址 cluster-endpoint" >> /etc/hosts  

5. 初始化 master 节点

只在 master 节点执行

# 注意: 替换 master的IP地址
kubeadm init \
--apiserver-advertie-address=master的IP地址 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

6. 三台机器放行 30000-32767

7. 记录关键信息,后面要用

8. 在 master 节点执行下面图片中的命令

9. 在 master 节点,安装 Calico 网络插件

curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -o

# 应用这个文件
kubectl apply -f calico.yaml

10. 在Node1 和 Node2 节点执行上面图片中的命令,令牌是24小时内有效

令牌如果失效了可以在 master 节点 使用下面命令申请新的令牌

kubeadm token create --print-join-command

11. 查看集群中的所有节点

kubectl get nodes

4. 安装 kubeSphere3 所需的前置环境

1. nfs-server(动态供应pv)

1. 三台机器 分别执行下面命令,安装 nfs 工具类

yum install -y nfs-utils

2. master 节点执行下面命令

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

# 创建共享目录
mkdir -p /nfs/data

# 启动 nfs 服务
systemctl enable recbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server

# 使配置生效
exportfs -r

# 检查配置是否生效
exportfs

3. node1 和 node2 分别配置 nfs-client ,让node1 和 node2可以同步这个目录(可以选做)

showmount -e master节点IP

mkdir -p /nfs/data

mount -t nfs master节点IP:/nfs/data /nfs/data

4. 配置默认存储,使其有动态供应能力

storageclass.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: 
  archiveOnDelete: "true"  ## 删除pv的时候,pv内容是否备份
  
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLables:
      app: nfs-client-provisioner
    template:
      metadata:
        labels:
          app: nfs-client-provisioner
      spec:
        serviceAccountName: nfs-client-provisioner
        containers:
          - name: nfs-client-provisioner
            image: registry.cn-hangzhou.aliyuncs.com/lfy_k9s_images/nfs-subdir-external-provisioner:v4
            volumeMounts:
              - name: nfs-client-root
                mountPath: /persistentvolumes
            env:
              - name: PROVISIONER_NAME
                value: k8s-sigs.io/nfs-subdir-external-provisioner
              - name: NFS_SERVER
                value: 自己nfs服务器的IP地址 # 需要修改成自己nfs服务器的IP地址
              - name: NFS_PATH
                value: /nfs/data  ## nfs服务器的共享目录
        volumes:
          - name: nfs-client-root
            nfs:
              server: 自己nfs服务器的IP地址 # 需要修改成自己nfs服务器的IP地址
              path: /nfs/data
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
posted @ 2024-02-26 17:30  河图s  阅读(35)  评论(0)    收藏  举报