【k8s】【视频教程70P】(一,非高可用k8s安装)
最后讲了高可用部署。
似还不错。先记下。以后再追记貌
https://www.bilibili.com/video/BV1ME411g7EU?p=10
最后一节构建了高可用的k8s
Harbor–》k8s–》软路由(koolshare)科学上网用。
环境介绍
- master 66.10
- node1 66.20
- node2 66.21
- harbor
都是centos7 (最好最稳定是4.4内核以上)
- koolshare(koolss) :192.168.1.1 -》 192.168.66.1
window虚拟机BIOS模式,PE模式,IDE虚拟磁盘类型。
- 基于最新稳定版Kubernetes 1.15.1(2019年8月发布)进行构建及讲解
centos 4个节点(master,node1,2,harbor)
// 略 网络:仅仅主机
软路由 (为了所有节点科学上网)
// windows10 虚拟机,PE https://www.bilibili.com/video/BV1ME411g7EU?p=11
- 光盘换成koolshare20140119,里面有”IMG写盘工具.exe”
- 添加网卡:nat模式
- 网页配置ssr
harbor 简单的构建
// 略
部署k8s
一, 【所有节点】部署前环境准备
https://www.bilibili.com/video/BV1ME411g7EU?p=12
设置系统主机名
- 修改主机名
hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02
- 加入/etc/hosts 小环境不建议用DNS,DNS容易有单点故障,造成k8s不可用 所以,可以直接修改/etc/hosts
- 拷贝/etc/hosts 到三台节点
安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
关闭防火墙 为iptables并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭SELINUX
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
针对k8s调整内核参数
//三条是必须,其他是优化
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1 #必须
net.bridge.bridge-nf-call-ip6tables=1 #必须
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁止使用swap空间
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1 #关闭ipv6协议
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
调整系统时区
#设置系统时区为中国上海
timedatectl set-timezone Asia/Shanghai
#将当天的UTC事件写入硬件时钟
timedatectl set-local-rtc 0
#重启跟系统时间有关的两个服务,否则他们不起作用
systemctl restart rsyslog
systemctl restart crond
关闭不需要的服务
systemctl stop postfix && systemctl disable postfix
设置log rsyslogd和systemd journald
不转发到syslog减轻服务器压力
mkdir /var/log/journal # 持久化保持日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保持到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大200M
SystemMaxFileSize=200M
# 日志保存时间2周
MaxRetentionSec=2week
# 不讲日志转发到syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
升级系统内核为4.44
3.1版本有小bug,导致docker运行不稳定
下载内核源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
安装最新版本内核
yum --enablerepo=elrepo-kernel install -y kernel-lt
查看可用内核
cat /boot/grub2/grub.cfg |grep menuentry
设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.221-1.el7.elrepo.x86_64) 7 (Core)"
查看内核启动项
grub2-editenv list
重启系统使内核生效
reboot
查看内核版本是否生效
uname -r
kube-proxy开启ipvs的前置条件
增加访问效率
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- ip_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
安装Docker软件
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum update -y && yum install -y docker-ce docker-ce-cli containerd.io
### 创建/etc/docker目录
mkdir /etc/docker
### 写配置文件daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts":["native.cgroupdirver=systemd"],
"log-driver":"json-file",
"log-opts":{
"max-size": "100m"
}
}
EOF
### 存放docker的配置文件
mkdir -p /etc/systemd/system/docker.service.d
### 重启docker并设置开机启动
systemctl daemon-reload && systemctl restart docker.service && systemctl enable docker.service
提示:做虚拟机快照,备份好
【Tip】手顺找一份。
安装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
//安装三个服务
yum install -y kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
// 必须开机自启
systemctl enable kubelet.service
<font face=”verdana” color=blue size=5>所有节点 “共通” 操作:
- 调整系统设置
- 安装docker
- 安装命令:kubeadm、kubectl、kubelete
</font>
二,【主节点】初始化主节点
初始化之前注意: kubeadm init命令需要访问到google,如果不能科学上网的。只能先下载到kubeadm-basic.images.tar.gz (多个镜像的集合),然后传到主节点。然后再执行kubeadm init!
首先,(不能科学上网的话)下载镜像,kubeadm init所依赖的镜像。然后导入到主节点的docker images里。
- 这步可以省略
k8s 部署需要访问google k8s云 ,若无法访问google ,上传所需镜像包即可
kubeadm-basic.images.tar.gz
kubeadm-basic.images.tar.gz winscp上传到主节点。
# 解压
tar -zxvf kubeadm-basic.images.tar.gz
## 编写并运行脚本导入到docker
#!/bin/bash
ls kubeadm-basic.images > /tmp/image-list.txt
cd /root/kubeadm-basic.images
for i in $( cat /tmp/image-list.txt )
do
docker load -i $i
done
rm -rf /tmp/image-list.txt
【主节点】初始化
# 生成 kubeadm 默认初始化模板
kubeadm config print init-defaults > kubeadm-config.yaml
修改kubeadm-config.yaml
vim kubeadm-config.yaml
localAPIEndpoint:
# 修改kubeadm-config.yaml 中advertiseAddress为当前节点的ip地址
# 修改kubernetesVersion 版本
advertiseAddress: 192.168.3.105
kubernetesVersion: v1.15.1
networking:
# 添加 podSubnet: "10.244.0.0/16" flannel插件网段
podSubnet: "10.244.0.0/16" #←this
serviceSubnet: 10.96.0.0/12
## 在最后插入下列配置 将默认调度模式改为ipvs模式
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
# 初始化代码 (--experimental-upload-certs 自动颁发证书)
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
[init] Using Kubernetes version: vX.Y.Z
[preflight] Running pre-flight checks
[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --token-ttl 0)
// 省略一部分
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (as a regular user):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the addon options listed at:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
log能看出来
- /etc/kubernetes/pki 存放的都是kubernetes各个组件之间通讯需要的私钥和证书,这些都是init命令生成的。
- DNS名称,地址
- /etc/kubernetes/存放所有配置文件
【主节点】 后续操作
首先,执行如下命令,完成配置的初始化:
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
这样之后,kubectl就可以用了,尝试一下
kubectl get node
只有master-01,NotReady状态(因为还没有flannel网络)
【主节点】安装网络插件
K8S的网络插件有很多种类可供选择,官网链接中已经给出了各种插件的安装方法。 这里用Weave Net
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
或者
mkdir -p install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core
mkdir -p install-k8s/plugin/flannel
cd install-k8s/plugin/flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
kubectl create -f kube-flannel.yml
//前两个命令可以合并成一条
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
网络插件安装完后,来确认一下服务是否启动成功。 -w就是监控
$ kubectl get pod -n kube-system -o wide -w
NAME READY STATUS RESTARTS AGE
coredns-576cbf47c7-dch4w 1/1 Running 1 90m
coredns-576cbf47c7-whnzs 1/1 Running 0 90m
etcd-izm5e9951st9peq42t8fkxz 1/1 Running 0 89m
kube-apiserver-izm5e9951st9peq42t8fkxz 1/1 Running 0 89m
kube-controller-manager-izm5e9951st9peq42t8fkxz 1/1 Running 0 89m
kube-proxy-s5khx 1/1 Running 0 90m
kube-scheduler-izm5e9951st9peq42t8fkxz 1/1 Running 0 89m
weave-net-29mjv 2/2 Running 0 75m
如果都是Running状态就说明启动起来了(刚安装完网络插件可能要等一会)
ifconfig
会多一个flannel
$ kubectl get nodes
master节点就Ready了
消除master节点的隔离(可选)
默认情况下,k8s是不会在master节点上自动部署业务上需要的应用的,如果是测试环境机器数量比较少,可以将这个隔离给去掉(这样master节点也可以部署应用了)。
$ kubectl taint nodes --all node-role.kubernetes.io/master-
会看到类似这样的输出
node/izm5e9951st9peq42t8fkxz untainted
error: taint "node-role.kubernetes.io/master:" not found
说明已经消除了隔离
<font face=”verdana” color=blue size=5>主节点:init、创建flannel网络</font>
三,【所有子节点】创建worker节点
(memo一下备用)一会要创建worker节点的时候需要用这句命令来让worker加入集群。
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
执行完后,在子节点上会初始化pod,所以需要稍微等等
另外还有这个命令,查看k8s集群中的所有节点状态
$ kubectl get pod -n kube-system -o wide -w
一会,所有pod都变成Running了
然后随便哪个节点上
kubectl get pod
可以看到所有节点都是Ready
<font face=”verdana” color=blue size=5>子节点:只需要执行join就可以了</font>
四,后续打扫(可选)
install-k8s/重要目录备份到/usr/local 删除不用的安装包
高可用k8s
https://www.bilibili.com/video/BV1ME411g7EU?p=68