002 - k8s -安装k8s集群

上一篇 001 - k8s - docker基础和常用操作
下一篇 003 - k8s - 资源清单

准备宿主机

初始化方式1: 直接在线下载box文件并初始化

vagrant init centos7 https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1811_02.VirtualBox.box

初始化方式2: box文件下载到本地, 初始化

vagrant box add ../CentOS-7-x86_64-Vagrant-1811_02.VirtualBox.box --name centos7
vagrant box list

Vagrantfile

为master-01/node-01/node-02三个节点分别在文件夹中执行
vagrant init centos7
修改Vagrantfile内容分别如下

cat <<EOF > ./master1/Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "master1"
  config.vm.synced_folder "./", "/vagrant"
  # config.vm.network "private_network", ip: "192.168.56.50"
  config.vm.network "public_network", ip: "192.168.31.50"
  config.vm.provider "virtualbox" do |v| #分配资源
    v.memory = 2048
    v.cpus = 2
  end
end
EOF
cat <<EOF > ./node1/Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "node1"
  config.vm.synced_folder "./", "/vagrant"
  # config.vm.network "private_network", ip: "192.168.56.51"
  config.vm.network "public_network", ip: "192.168.31.51"
  config.vm.provider "virtualbox" do |v| #分配资源
    v.memory = 2048
    v.cpus = 2
  end
end
EOF
cat <<EOF > ./node2/Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "node2"
  config.vm.synced_folder "./", "/vagrant"
  # config.vm.network "private_network", ip: "192.168.56.52"
  config.vm.network "public_network", ip: "192.168.31.52"
  config.vm.provider "virtualbox" do |v| #分配资源
    v.memory = 2048
    v.cpus = 2
  end
end
EOF

之后分别执行

vagrant up
vagrant ssh

在每个节点上的操作

添加 hosts 信息

cat <<EOF >> /etc/hosts
192.168.1.50 master1
192.168.1.51 node1
192.168.1.52 node2
EOF

节点的 hostname 必须使用标准的 DNS 命名,另外千万不用什么默认的 localhost 的 hostname,会导致各种错误出现的。在 Kubernetes 项目里,机器的名字以及一切存储在 Etcd 中的 API 对象,都必须使用标准的 DNS 命名(RFC 1123)。可以使用命令 hostnamectl set-hostname node1 来修改 hostname。

禁用防火墙

systemctl stop firewalld
systemctl disable firewalld

为了保证安装成功, 小白阶段的我还是先这样

更改setlinux级别,禁用SELINUX

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

修改后需要重启服务器才能生效
查看selinux状态
cat /etc/selinux/config

getenforce

加载br_netfilter

由于开启内核 ipv4 转发需要加载 br_netfilter 模块,所以加载下该模块

modprobe br_netfilter

k8s.conf

创建配置文件

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

使配置生效

sysctl -p /etc/sysctl.d/k8s.conf

bridge-nf 使得 netfilter 可以对 Linux 网桥上的 IPv4/ARP/IPv6 包过滤。比如,设置net.bridge.bridge-nf-call-iptables=1后,二层的网桥在转发包时也会被 iptables的 FORWARD 规则所过滤。常用的选项包括:

  • net.bridge.bridge-nf-call-arptables:是否在 arptables 的 FORWARD 中过滤网桥的 ARP 包
  • net.bridge.bridge-nf-call-ip6tables:是否在 ip6tables 链中过滤 IPv6 包
  • net.bridge.bridge-nf-call-iptables:是否在 iptables 链中过滤 IPv4 包
  • net.bridge.bridge-nf-filter-vlan-tagged:是否在 iptables/arptables 中过滤打了 vlan 标签的包

安装 ipvs

cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules

bash /etc/sysconfig/modules/ipvs.modules

lsmod | grep -e ip_vs -e nf_conntrack_ipv4

上面脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

安装 ipset 软件包

yum install ipset -y
yum install ipvsadm -y

为了便于查看 ipvs 的代理规则,最好安装一下管理工具 ipvsadm

同步服务器时间

yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources

关闭 swap 分区

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

修改/etc/fstab文件,注释掉 SWAP 的自动挂载,使用free -m确认 swap 已经关闭。swappiness 参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行

cat <<EOF >> /etc/sysctl.d/k8s.conf
vm.swappiness=0
EOF

cat /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf

安装docker

可参考另一篇文章:
https://blog.csdn.net/qq_35315314/article/details/121962802
或参考如下操作:

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

使用阿里云的源代替:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce-19.03.11
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "registry-mirrors" : [
    "https://ot2k4d59.mirror.aliyuncs.com/"
  ]
}
EOF
systemctl start docker
systemctl enable docker

由于默认情况下 kubelet 使用的 cgroupdriver 是 systemd,所以需要保持 docker 和kubelet 的 cgroupdriver 一致,我们这里修改 docker 的 cgroupdriver=systemd。如果不修改 docker 则需要修改 kubelet 的启动配置,需要保证两者一致。

安装 Kubeadm

这里是通过指定yum 源的方式来进行安装的

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

安装 kubeadm/kubelet/kubectl

–disableexcludes 禁掉除了kubernetes之外的别的仓库

yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 --disableexcludes=kubernetes
kubeadm version
systemctl enable --now kubelet

允许节点间ssh密码登录

vi /etc/ssh/sshd_config

PermitRootLogin yes
PermitEmptyPasswords yes
PasswordAuthentication yes
PubkeyAuthentication yes

到这里为止上面所有的操作都需要在所有节点执行配置

master节点到node节点免密登录

在master节点中执行

cd /root
ssh-keygen -t rsa
ssh-copy-id -i  /root/.ssh/id_rsa.pub root@node1
ssh-copy-id -i  /root/.ssh/id_rsa.pub root@node2

初始化集群

kubeadm 初始化文件

在 master 节点配置 kubeadm 初始化文

cd /root
kubeadm config print init-defaults > kubeadm.yaml
cat <<EOF > kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.1.50  # apiserver 节点内网IP
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/k8sxio
# registry.aliyuncs.com/k8sxio   # 修改成阿里云镜像源
# registry.aliyuncs.com/google_containers   # 修改成阿里云镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.19.3
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16  # Pod 网段,flannel插件需要使用这个网段
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs  # kube-proxy 模式
EOF

对于上面的资源清单的文档比较杂,要想完整了解上面的资源对象对应的属性,可以查看对应的 godoc 文档,地址: https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2。

然后使用上面的配置文件进行初始化, 首先可以先列出初始化所需镜像, 然后再去拉取所需镜像

kubeadm config images list --config kubeadm.yaml
kubeadm config images pull --config kubeadm.yaml
kubeadm init --config kubeadm.yaml

要开始使用集群,您需要作为普通用户运行以下命令

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

添加节点

登入node节点, 以root身份运行该命令

kubeadm join 10.0.2.15:6443 --token 7cimvi.edwxn14bf0x8eh0q     --discovery-token-ca-cert-hash sha256:d7f30e7461b3d046d6282109ab3b3375136fa548b85e012a9a558e81395a8f8a

如果忘记了上面的 join 命令可以使用命令 kubeadm token create --print-join-command 重新获取。

查看集群节点

执行成功后在master节点上运行 get nodes 命令

kubectl get nodes

可以看到是 NotReady 状态,这是因为还没有安装网络插件,接下来安装网络插件,可以在文档 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 中选择我们自己的网络插件,这里我们安装 flannel:

$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 因为有节点是多网卡,所以需要在资源清单文件中指定内网网卡
# 搜索到名为 kube-flannel-ds 的 DaemonSet,在kube-flannel容器下面
$ vi kube-flannel.yml
......
containers:
- name: kube-flannel
  image: quay.io/coreos/flannel:v0.13.0
  command:
  - /opt/bin/flanneld
  args:
  - --ip-masq
  - --kube-subnet-mgr
  - --iface=eth0  # 如果是多网卡的话,指定内网网卡的名称
......

或者可执行链接中的命令

安装 flannel 网络插件

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
kubectl apply -f kube-flannel.yml

隔一会儿查看 Pod 运行状态

kubectl get pods -n kube-system
kubectl get nodes

清理

如果你的集群安装过程中遇到了其他问题,我们可以使用下面的命令来进行重置

kubeadm reset
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
rm -rf /var/lib/cni/

每次重启虚拟机都需要去重新启动和连接集群

清理集群[all]

kubeadm reset

启动集群[master]

cd /root
kubeadm init --config kubeadm.yaml

退出到普通用户并准备连接[master]

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

进入root用户获得连接token[master]

kubeadm token create --print-join-command

在node节点执行连接命令[node]

kubeadm join 192.168.1.50:6443 --token qpv0jo.dqucx7tdwhhfygmc...

在master节点查看集群节点列表[master]

kubectl get nodes

Dashboard

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
vi recommended.yaml

修改Service为NodePort类型

......
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort  # 加上type=NodePort变成NodePort类型的服务
......

在 YAML 文件中可以看到新版本 Dashboard 集成了一个 metrics-scraper 的组件,可以通过 Kubernetes 的 Metrics API 收集一些基础资源的监控信息,并在 web 页面上展示,所以要想在页面上展示监控信息就需要提供 Metrics API,比如安装 Metrics Server。

kubectl apply -f recommended.yaml

新版本的 Dashboard 会被默认安装在 kubernetes-dashboard 这个命名空间下面

kubectl get pods -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard

然后可以通过上面的 443:xxxxx 端口去访问 Dashboard,要记住使用 https,Chrome 不生效可以使用Firefox 测试,如果没有 Firefox 下面打不开页面,可以点击下页面中的信任证书即可
https://master外网IP:xxxxx/#/login

然后创建一个具有全局所有权限的用户来登录 Dashboard:(admin.yaml)

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard

直接创建

kubectl apply -f admin.yaml
kubectl get secret -n kubernetes-dashboard|grep admin-token
kubectl get secret admin-token-lwmmx -o jsonpath={.data.token} -n kubernetes-dashboard |base64 -d# 会生成一串很长的base64后的字符串

然后用上面的 base64 解码后的字符串作为 token 登录 Dashboard 即可

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值