第二课 Kubernetes生产级实践-kubeadm方式环境搭建

第二课 Kubernetes生产级实践-kubeadm方式环境搭建

tags:

  • k8s
  • 慕课网

categories:

  • kubeadm方式搭建

第一节 实践环境准备

1.1 服务器说明

我们这里使用的是五台centos-7.8的虚拟机三台主节点和一个从节点,具体信息如下表:

系统类型IP地址节点角色CPUMemoryHostname
centos-7.8192.168.242.136master>=2>=2Gm1
centos-7.8192.168.242.137master>=2>=2Gm2
centos-7.8192.168.242.138master>=2>=2Gm3
centos-7.8192.168.242.130worker>=2>=2Gs1
centos-7.8192.168.242.131worker>=2>=2Gs2

1.2 系统设置(所有节点)

  1. 设置主机名。主机名必须每个节点都不一样,并且保证所有点之间可以通过hostname互相访问。
# 查看主机名
hostname
# 修改主机名
hostnamectl set-hostname <your_hostname>
# 配置host,使所有节点之间可以通过hostname互相访问
vi /etc/hosts
# <node-ip> <node-hostname>
  1. 安装依赖包
# 更新yum
yum update
# 安装依赖包
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp git vim net-tools
  1. 关闭防火墙、swap,重置iptables
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 重置iptables
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 关闭swap
swapoff -a
# 使用下面的命令对文件/etc/fstab操作,注释 /dev/mapper/centos_master-swap  swap  swap    defaults        0 0 这行
sed -i 's/.*swap.*/#&/' /etc/fstab
# 关闭selinux
vim /etc/selinux/config 
# 将SELINUX=enforcing改为SELINUX=disabled
setenforce 0
# 查看selinux状态
sestatus
# 关闭dnsmasq(否则可能导致docker容器无法解析域名)
service dnsmasq stop && systemctl disable dnsmasq
  1. 系统参数设置
# 制作配置文件
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
# 生效文件
sysctl -p /etc/sysctl.d/kubernetes.conf
# 执行sysctl -p 时出现下面的错误
# sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
# sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
# 解决方法:运行命令 modprobe br_netfilter 然后再执行 sysctl -p /etc/sysctl.d/kubernetes.conf
modprobe br_netfilter
# 查看
ls /proc/sys/net/bridge
bridge-nf-call-arptables bridge-nf-filter-pppoe-tagged
bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged
bridge-nf-call-iptables bridge-nf-pass-vlan-input-dev

1.3 安装docker(所有节点)

# 1. 方法一: 通过yum源的方式安装
# 创建所需目录
mkdir -p /opt/kubernetes/docker && cd /opt/kubernetes/docker
# 清理原有版本, 如果系统没有安装过跳过
yum remove -y docker* container-selinux
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 可以查看所有仓库中所有docker版本,并选择特定版本安装:
yum list docker-ce --showduplicates | sort -r
# 安装指定版本docker, 如果不指定版本号,将安装最新版本的docker
# sudo yum install -y docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 示例-安装docker版本是: 19.03.8
yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
# 开机启动
systemctl enable docker && systemctl start docker

# 2. 方法二: 通过rpm方式安装
# 手动下载rpm包【示例docker 19.03.8版本的安装】
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.8-3.el7.x86_64.rpm
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.8-3.el7.x86_64.rpm
# 安装rpm包
yum localinstall -y *.rpm
# 开机启动
systemctl enable docker && systemctl start docker


# 设置参数
# 1.查看磁盘挂载
df -h
# 2.设置docker启动参数
# - 设置docker数据目录:选择比较大的分区(我这里是根目录就不需要配置了,默认为/var/lib/docker)
# - 设置cgroup driver, 防止文件驱动不一致,导致镜像无法启动(默认是cgroupfs,主要目的是与kubelet配置统一,这里也可以不设置后面在kubelet中指定cgroupfs)
# docker info 可以查看到cgroup driver的类型
cat <<EOF > /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
   		"https://registry.cn-hangzhou.aliyuncs.com",
   		 "https://fz5yth0r.mirror.aliyuncs.com",
          "https://dockerhub.mirrors.nwafu.edu.cn/",
          "https://mirror.ccs.tencentyun.com",
          "https://docker.mirrors.ustc.edu.cn/",
          "https://reg-mirror.qiniu.com",
          "http://hub-mirror.c.163.com/",
          "https://registry.docker-cn.com"
    ]
}
EOF
# 启动docker服务
systemctl start docker

# daemon.json 详细配置示例
{
  "debug": false,
  "experimental": false,
  "graph": "/home/docker-data",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://fy707np5.mirror.aliyuncs.com"
  ],
  "insecure-registries": [
    "hub.zy.com",
    "172.16.249.159:8082"
  ]
}
# 启动docker服务
systemctl restart docker

1.4 安装必要工具(所有节点)

  1. 需要安装如下工具:

    • kubeadm: 部署集群用的命令
    • kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
    • kubectl: 集群管理工具(可选,只要在控制集群的节点上安装即可)
  2. 安装方法

# 配置yum源(科学上网的同学可以把"mirrors.aliyun.com"替换为"packages.cloud.google.com")
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装工具
# 找到要安装的版本号
yum list kubeadm --showduplicates | sort -r

# 安装指定版本(这里用的是1.18.2)
yum install -y kubeadm-1.18.2-0 kubelet-1.18.2-0 kubectl-1.18.2-0 --disableexcludes=kubernetes

# 设置kubelet的cgroupdriver(kubelet的cgroupdriver默认为systemd,如果上面没有设置docker的exec-opts为systemd,这里就需要将kubelet的设置为cgroupfs)
# sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 启动kubelet 所有的节点
systemctl enable kubelet && systemctl start kubelet

1.5准备配置文件(任意节点)

  1. 下载配置文件。我这准备了一个项目,专门为大家按照自己的环境生成配置的。它只是帮助大家尽量的减少了机械化的重复工作。它并不会帮你设置系统环境,不会给你安装软件。总之就是会减少你的部署工作量,但不会耽误你对整个系统的认识和把控。
cd ~ && git clone https://gitee.com/qnhyn/kubernetes-ha-kubeadm.git
# 看看git内容
ls -l kubernetes-ha-kubeadm
addons/
configs/
scripts/
init.sh
global-configs.properties
  1. 文件目录说明
  • addons

kubernetes的插件,比如calico和dashboard。

  • configs

包含了部署集群过程中用到的各种配置文件。

  • scripts

包含部署集群过程中用到的脚本,如keepalive检查脚本。

  • global-configs.properties

全局配置,包含各种易变的配置内容。

  • init.sh

初始化脚本,配置好global-config之后,会自动生成所有配置文件。

  1. 生成配置。这里会根据大家各自的环境生成kubernetes部署过程需要的配置文件。

此脚本不支持MACOS系统,切记不要使用MACOS来运行 init.sh

# cd到之前下载的git代码目录
cd kubernetes-ha-kubeadm

# 编辑属性配置(根据文件注释中的说明填写好每个key-value)
vi global-config.properties

# 生成配置文件,确保执行过程没有异常信息
./init.sh

# 查看生成的配置文件,确保脚本执行成功
find target/ -type f

执行init.sh常见问题:

  1. Syntax error: “(” unexpected
  • bash版本过低,运行:bash -version查看版本,如果小于4需要升级
  • 不要使用 sh init.sh的方式运行(sh和bash可能不一样哦)
  1. global-config.properties文件填写错误,需要重新生成
    再执行一次./init.sh即可,不需要手动删除target

第二节 搭建高可用集群

  1. 部署keepalived-apiserver高可用(任选两个master节点)

2.1 安装keepalived

# 在两个主节点上安装keepalived(一主一备)
yum install -y keepalived
  1. 创建keepalived配置文件
  2. 检查脚本文件mkdir -p /etc/keepalived
#!/bin/sh
errorExit() {
 echo "*** $*" 1>&2
 exit 1
}

curl --silent --max-time 2 --insecure https://localhost:6443/ -o /dev/null || errorExit "Error GET https://localhost:6443/"
if ip addr | grep -q 192.168.242.140; then
 curl --silent --max-time 2 --insecure https://192.168.242.140:6443/ -o /dev/null || errorExit "Error GET https://192.168.242.130:6443/"
fi
# 创建目录
ssh <user>@<master-ip> "mkdir -p /etc/keepalived"
ssh <user>@<backup-ip> "mkdir -p /etc/keepalived"

# 到第一节中的中转节点(有git下载的节点) 分发配置文件主节点和从节点不同
scp target/configs/keepalived-master.conf <user>@<master-ip>:/etc/keepalived/keepalived.conf
scp target/configs/keepalived-backup.conf <user>@<backup-ip>:/etc/keepalived/keepalived.conf

# 分发监测脚本 文件主节点和从节点文件相同
scp target/scripts/check-apiserver.sh <user>@<master-ip>:/etc/keepalived/
scp target/scripts/check-apiserver.sh <user>@<backup-ip>:/etc/keepalived/
  1. 查看配置和脚本,启动keepalived
    • state: 填写MASTER(主master节点m0)或BACKUP(其他master节点)
    • interface: 填写网卡的名字
    • prority: 权重,主master节点应该比其他节点高(比如m0填写101,其他节点填写100)
    • auth_pass: 任意随机字符
    • virtual_ipaddress: 应该填写为master节点准备的虚拟ip
# 分别在master和backup上启动服务
systemctl enable keepalived && service keepalived start

# 检查状态
systemctl status keepalived

# 查看日志
journalctl -f -u keepalived

# 查看虚拟ip ping 虚拟ip
ip a

2.2 部署第一个主节点

# 准备配置文件
scp target/configs/kubeadm-config.yaml <user>@<node-ip>:~
# ssh到第一个主节点,执行kubeadm初始化系统(注意保存最后打印的加入集群的命令)
# $ kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
kubeadm init --config=kubeadm-config.yaml --upload-certs
# copy kubectl配置(上一步会有提示)
mkdir -p ~/.kube
cp -i /etc/kubernetes/admin.conf ~/.kube/config

# 加入其它主节点
kubeadm join 192.168.242.140:6443 --token houkvd.mpqp641boc635gyh --discovery-token-ca-cert-hash sha256:29a245c29c909ab4b8ecf5c90acb48d7a48bfb8400aaa3734f72e3bf587f5dee --control-plane --certificate-key b2ec5bfd68391a822ac7b94118b9099e452a4eb4ba3c134c3cfd38bd71a8d216

# 加入其它节点
kubeadm join 192.168.242.140:6443 --token houkvd.mpqp641boc635gyh \
    --discovery-token-ca-cert-hash sha256:29a245c29c909ab4b8ecf5c90acb48d7a48bfb8400aaa3734f72e3bf587f

# 测试一下kubectl
# 使用curl命令请求一下健康检查接口,返回ok代表没问题:
curl -k https://192.168.243.140:6443/healthz
kubectl get pods --all-namespaces

# **备份init打印的join命令**

2.3 部署网络插件 - calico

我们使用calico官方的安装方式来部署,请参阅下面的地址
Calico配置文件说明

# 创建目录(在配置了kubectl的节点上执行)
mkdir -p /etc/kubernetes/addons

# 上传calico配置到配置好kubectl的节点(一个节点即可)
scp target/addons/calico* <user>@<node-ip>:/etc/kubernetes/addons/

# addons 有两个配置文件 具体的内容请参阅 上面的那个 Calico配置文件说明 链接地址
# less-50-calico.yaml 节点数量小于50使用的配置文件
# more-50-calico.yaml 节点数量大于50台使用的配置文件

# 官方提供的地址
# 当节点数量大于 50台的时候使用
# curl https://docs.projectcalico.org/manifests/calico-typha.yaml -o calico.yaml
# 当节点数量小于50台使用
# curl https://docs.projectcalico.org/manifests/calico.yaml -O

# 部署calico
# 修改文件名称,根据具体的情况自行修改
mv /etc/kubernetes/addons/less-50-calico.yaml calico.yaml
kubectl apply -f /etc/kubernetes/addons/calico.yaml

# 查看状态
kubectl get pods -n kube-system

# 若电脑重启 服务不能自动重启 看下--cgroup-driver 从默认cgroup修改为systemd
vi /var/lib/kubelet/kubeadm-flags.env
systemctl daemon-reload && systemctl restart kubelet

2.4 加入其它master节点

# 使用之前保存的join命令加入集群
kubeadm join ...
# 例如:
kubeadm join 192.168.242.130:6443 --token ctpyu8.2t9vz9gyxggmnvdb  --discovery-token-ca-cert-hash sha256:fae8817a1547fcc4bb848b31c686b267e2360105986462164a85b07044fe7632  --control-plane

# 耐心等待一会,并观察日志
$ journalctl -f

# 查看集群状态
# 1.查看节点
$ kubectl get nodes
# 2.查看pods
$ kubectl get pods --all-namespaces

# 遇到问题
# certificate-key 默认2小时的有效期,如果过期按照提示重新生成
error execution phase control-plane-prepare/download-certs: error downloading certs: error downloading the secret: Secret "kubeadm-certs" was not found in the "kube-system" Namespace. This Secret might have expired. Please, run `kubeadm init phase upload-certs --upload-certs` on a control plane to generate a new one
# 使用命令重新生成 certificate-key 
# 用新证书替换--certificate-key后面的内容
# 如上面的命令中的:d5c80e1843f6b0f5eddb0c88d215390dbe2c0ef6d4f6b63463b3c2ef6dfd726e
$ kubeadm init phase upload-certs --upload-certs
[upload-certs] Using certificate key:
a542b8308394773278da70ab0d11914f6e048fcd73524ecfef56b3633a39d3f1

2.5 加入worker节点

# 使用之前保存的join命令加入集群
$ kubeadm join ...
# 例如
$ kubeadm join 172.16.249.133:6443 --token 8mr8km.w3ucsw6gbq50ffpw \
    --discovery-token-ca-cert-hash sha256:b7eb3ab4c45577386a6801e166aa7d844a246b5afcaf7890126e1a95bfad3d30

# 耐心等待一会,并观察日志
$ journalctl -f

# 查看节点
$ kubectl get nodes
# 重新添加节点
# 默认情况下,kubeadm init产生的token的有效期是24个小时,在一天之后才kubeadm join的,用下面的命令来重新产生token
$ kubeadm token create --certificate-key xxxx --print-join-command
例如
kubeadm token create --certificate-key a542b8308394773278da70ab0d11914f6e048fcd73524ecfef56b3633a39d3f1 --print-join-command
# 直接使用 kubeadm token create --print-join-command 也可以

第三节 集群可用性测试

3.1 创建nginx的ds

 # 写入配置
$ cat > nginx-ds.yml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-ds
  labels:
    app: nginx-ds
spec:
  type: NodePort
  selector:
    app: nginx-ds
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      app: nginx-ds
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.17
        ports:
        - containerPort: 80
EOF

# 创建ds
kubectl create -f nginx-ds.yml

3.2 检查各种ip连通性

# 检查各 Node 上的 Pod IP 连通性
$ kubectl get pods  -o wide

# 在每个节点上ping pod ip
$ ping <pod-ip>

# 检查service可达性
$ kubectl get svc

# 在每个节点上访问服务
$ curl <service-ip>:<port>

# 在每个节点检查node-port可用性 每个ip和虚拟ip都可以加NodePort
$ curl <node-ip>:<port>

3.3 检查dns可用性

# 创建一个nginx pod
cat > pod-nginx.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.17
    ports:
    - containerPort: 80
EOF

# 创建pod
kubectl create -f pod-nginx.yaml

# 进入pod,查看dns
kubectl exec  nginx -i -t -- /bin/bash

# 查看dns配置
root@nginx:/# cat /etc/resolv.conf

# 查看名字是否可以正确解析
root@nginx:/# ping nginx-ds

第四节 部署dashboard

4.1 部署dashboard 2.x版本

  1. Dashboard 分为 1.x版本 和 2.x版本, k8s 使用的是1.18.2 故部署2.x版本的
# dashboard 2.x版本的部署
# 上传dashboard配置
scp target/addons/recommended.yaml <user>@<node-ip>:/etc/kubernetes/addons/
# 进行部署
kubectl apply -f /etc/kubernetes/addons/recommended.yaml
# 查看服务运行情况
kubectl get deployment kubernetes-dashboard -n kubernetes-dashboard
kubectl -n kubernetes-dashboard get pods -o wide
kubectl get services kubernetes-dashboard -n kubernetes-dashboard
netstat -ntlp|grep NodePort端口
  1. 部署dashboard 2.x版本的部署说明
    参考地址
# 1. 下载配置文件, 可能需要翻墙,如果不能科学上网访问
#  https://github.com/kubernetes/dashboard/blob/master/aio/deploy/recommended.yaml 拷贝出文件内容
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml
# 2. 修改配置文件(大约在32行Service段) 在spec 中加入 type: NodePort, nodePort: 30005 配置
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30005
  selector:
    k8s-app: kubernetes-dashboard
# 2. 进行部署
kubectl apply -f recommended.yaml

4.2 访问dashboard

  1. 为了集群安全,从 1.7 开始,dashboard 只允许通过 https 访问,我们使用nodeport的方式暴露服务,可以使用 https://NodeIP:NodePort 地址访问
  2. 关于自定义证书
    • 默认dashboard的证书是自动生成的,肯定是非安全的证书,如果大家有域名和对应的安全证书可以自己替换掉。使用安全的域名方式访问dashboard。
    • 在dashboard-all.yaml中增加dashboard启动参数,可以指定证书文件,其中证书文件是通过secret注进来的。

- –tls-cert-file
- dashboard.cer
- –tls-key-file
- dashboard.key

4.3 登录dashboard 2.x

  1. Dashboard 默认只支持 token 认证,所以如果使用 KubeConfig 文件,需要在该文件中指定 token,我们这里使用token的方式登录
# 创建service account
kubectl create sa dashboard-admin -n kubernetes-dashboard

# 创建角色绑定关系
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin

# 查看dashboard-admin的secret名字
ADMIN_SECRET=$(kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin | awk '{print $1}')

# 打印secret的token
kubectl describe secret -n kubernetes-dashboard ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}'

4.4 谷歌浏览器访问

用谷歌浏览器(chrome)访问 https://NodeIP:NodePort 地址, 此时浏览器打开后提示证书不授信。复制上面证书。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值