安装环境
操作系统:CentOS-7.6
内核版本:3.xxx
Docker版本:18.09.9
Kubernetes版本:1.16.4
服务架构
master(hostname):
ip:47.21.122.31
核心数:2 core
内存:4 GB
node1(hostname):
ip:47.21.122.33
核心数:2 core
内存:4 GB
node2(hostname):
ip:47.21.122.32
核心数:2 core
内存:4 GB
安装前的准备工作
1. 配置 /etc/host 文件
cat >> /etc/hosts << EOF
47.21.122.31 master
47.21.122.33 node1
47.21.122.32 node2
EOF
2. 禁用swap(Kubernetes-1.16.4安装时不禁用会报错)
# 临时禁用,执行以下命令:
swapoff -a
# 永久禁用,需要在swapoff -a之后,执行以下命令:
sed -i.bak '/swap/s/^/#/' /etc/fstab
3. SSH免密登录(只要操作master节点)
# 生成本地私钥和公钥
ssh-keygen -t rsa
# 将公钥拷贝到指定主机
ssh-copy-id node1
ssh-copy-id node2
4. 设置kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF4.1 更新缓存
yum clean all
yum -y makecache
Docker安装(master节点和node节点都操作)
1. 配置docker源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2. 安装依赖包 yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
3. 设置从stable仓库获取docker资源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4. 安装docker(这里指定18.09.9版本)
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
# 注:查看docker历史版本命令
yum list docker-ce --showduplicates | sort -r
5. 启动docker(设置开机自动重启)
systemctl start docker && systemctl enable docker
6. 命令补全
# 安装bash-completion
yum -y install bash-completion
# 加载bash-completion
source /etc/profile.d/bash_completion.sh
7. 镜像加速(并修改Cgroup Driver)
# 编辑docker-daemon文件
vim /etc/docker/daemon.json
{"registry-mirrors": ["https://usydjf4t.mirror.aliyuncs.com", "https://registry.docker-cn.com"], "exec-opts": ["native.cgroupdriver=systemd"] }
# 重新加载docker
systemctl daemon-reload# 重启docker服务
systemctl restart docker# 注:修改cgroupdriver是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
Keepalived安装(master节点安装)
前言
为了保证Master的高可用,会使用多个服务器(作为一个Master集群,一般使用3台服务器,每台服务器都需要安装kube-apiserver、kube-controller-manager、kube-scheduler、etcd等组件),客户端将会通过负载均衡器进行访问kube-apiserver(Master服务器)。在不同的平台下,负载均衡的实现方式不同:公有云一般都有现成的实现方案(这里不进行过多讨论);本地集群,可以选择硬件(例如,F5)或者软件来实现,kubernetes社区推荐方案HAProxy和Keepalived,其中HAProxy负责负载均衡,而Keepalived负责对HAProxy进行监控和故障切换。
由于只有一台2核机器,这里没有使用master集群,也没有使用HAProxy,但是仍然提供了Keepalived的安装,以便于使用虚拟IP(47.21.122.130),Node节点可以通过该IP进行访问Master,即使其他Master加入之后,也是通过虚拟IP进行访问
1. 安装keepalived
yum -y install keepalived
2. keepalived配置
# 保留默认配置
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf
# 写入新的配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {router_id hadoop101 }vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 50priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.21.122.130} }
3. 启动keepalived
service keepalived start && systemctl enable keepalived
4. VIP 查看
ip a
安装Kubernetes(master节点和node节点都操作)
1. 查看kubernetes版本
yum list kubelet --showduplicates | sort -r
2. 安装kubelet、kubeadm和kubecrl(注意版本号,根据需要进行改变)
yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
说明:
- kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
- kubeadm 用于初始化集群,启动集群的命令工具
- kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
3. 启动kubelet(并设置为开机自启动)
systemctl enable kubelet && systemctl start kubelet
4. 命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile5. 下载镜像
# 下载部署kubernetes所需要的所有镜像
vim image.sh
#!/bin/bash url=registry.cn-hangzhou.aliyuncs.com/google_containers #阿里云镜像仓库地址,可以按需修改 version=v1.16.4 #安装的kubernetes的版本(可以按需修改) images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`) for imagename in ${images[@]} ; dodocker pull $url/$imagenamedocker tag $url/$imagename k8s.gcr.io/$imagenamedocker rmi -f $url/$imagename done
chmod 755 image.sh
./image.sh6. 查看已经下载的镜像
docker images
配置网络插件 flannel(master节点操作)
1. br_netfilter模块加载
# 查看br_netfilter模块
lsmod |grep br_netfilter
# 如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略
vim /etc/rc.sysinit
#!/bin/bash for file in /etc/sysconfig/modules/*.modules ; do [ -x $file ] && $file done
vim /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
2. 内核参数永久修改
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1
sysctl -p /etc/sysctl.d/k8s.conf
初始化master(master节点操作)
1. 创建初始化文件
# 获取默认的初始化参数文件
kubeadm config print init-defaults > init.default.yaml
# 查看init.default.yaml文件
cat init.default.yaml
# 配置初始化文件
vim /root/kubeadm.conf.yaml
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.16.4 apiServer:certSANs: #填写所有kube-apiserver节点的hostname、IP- hadoop101- hadoop102- hadoop103- 172.21.122.35- 172.21.122.36- 172.21.122.34 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers networking:podSubnet: "10.244.0.0/16" #这里需要根据具体的网络插件来配置(这里使用的flannel网络插件配置)
2. 初始化kubernetes
# 初始化kubeadm.conf.yaml文件
kubeadm init --config=kubeadm.conf.yaml
说明:
如果初始化失败,可执行kubeadm reset后重新初始化(执行以下两条命令)
kubeadm reset
rm -rf $HOME/.kube/config# 保存初始化成功的最后一段信息,用于其他节点加入时使用
例:
kubeadm join 172.21.122.35:6443 --token 7uz9q5.lt1nfidq6xr2olkf \
--discovery-token-ca-cert-hash sha256:5c6b1dcdf420773746c1b44f4b791116de07db2f68b4bb9984eae1088472234a3. 加载环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
node节点加入集群(node节点操作)
1. 开启Master节点防火墙端口
# 查看防火墙状态
systemctl status firewalld
# 开启6443端口
firewall-cmd --zone=public --add-port=6443/tcp --permanent
出现success表明添加成功命令含义:
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效# 重启防火墙
systemctl restart firewalld.service
说明:
Kubernetes集群中的Service可使用的物理机端口号范围为30000~32767
一次全部公开所有可能使用的端口:
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
systemctl restart firewalld.service2. 加入集群
# 把之前保存的两行信息复制出来,在node节点执行
kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \
--discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562# 在master节点,执行以下命令查看已经加入的节点
kubectl get nodes
说明:
由于没有安装网络插件,这里STATUS为NotReady
安装网络插件(master节点操作)
# 在master主机上执行以下命令
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
说明:
由于网络原因,可能会安装失败,可以在浏览器直接下载kube-flannel.yml文件(也可以在浏览器打开url地址,然后复制文件内容到文件),然后再执行apply# 查看节点状态
kubectl get nodes
说明:
STATUS从NotReady变为Ready
如安装网络插件之后,长时间状态没有变更,则可以试试重启机器(或者是虚拟机,这里是指Centos 7系统)
Client配置(client端执行)
无,可以用master节点代替
Dashboard搭建(master端执行)
# 下载yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
# 修改镜像地址
sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml
# 配置yaml
sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
说明:
配置NodePort,外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001# 创建超级管理员账号用于登录Dashboard
vim dashboard-adminuser.yaml
--- # ------------------- dashboard-admin ------------------- # apiVersion: v1 kind: ServiceAccount metadata:name: dashboard-adminnamespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata:name: dashboard-admin subjects: - kind: ServiceAccountname: dashboard-adminnamespace: kubernetes-dashboard roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
# 部署Dashboard
kubectl apply -f recommended.yaml
# 生效 service account
kubectl apply -f dashboard-adminuser.yaml
# 状态查看
kubectl get all -n kubernetes-dashboard
# 令牌查看
kubectl describe secrets -n kubernetes-dashboard dashboard-admin
注:如果忘记Token,可以通过以下命令获取:
kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'# 使用火狐浏览器浏览
https://master:30001
查找问题方式
# 查看所有Pod
kubectl get pods --all-namespace
# 查看Pod日志(使用真实的pod名称,替换pod-name)
kubectl logs pod-name --all-containers=true
# 查看异常状态的Pod的详细信息
kubectl describe pod kubernetes-dashboard-8478d57dc6-p7jt7 --namespace=kubernetes-dashboard
# 防火墙的问题(如果不关闭防火墙容器可能会出现no host to route错误)
systemctl stop firewalld.service
systemctl disable firewalld.service
# Dashboard证书过期的问题
# Node节点执行kubectl命令出错问题
需要将master节点的 /etc/kubernetes/admin.conf 文件复制到node节点 /home/.kube 目录下
scp /etc/kubernetes/admin.conf ${username}@${hostname1}:/${home}/.kube/config
scp /etc/kubernetes/admin.conf ${username}@${hostname2}:/${home}/.kube/config