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
参数详解
--service-cidr: k8s集群内部对于大量请求进行负载均衡的时候使用的网段,--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. 准备工作
- 选择4核8G(master)、8核16G(node1)、8核16G(node2) 三台机器,Linux版本为
CentOS7.9,按需付费进行实验 - 安装Docker
 - 安装kubernetes
 - 安装kubeSphere前置环境
 - 安装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

                
            
        
浙公网安备 33010602011771号