002 - k8s -安装k8s集群
准备CentOS7.6版本的宿主机准备k8s所需环境安装Docker安装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)