上一节开篇,废话了很多,这篇咱们直接进入主题,搞一个k8s学习环境。
由于官方上推荐初学者学习minikube这个环境,由于这东西基本是一键部署,本人还是想了解一下各个组件之间的安装以及各配置文件如何修改,所以决定搭建传统的k8s集群环境。
本人的计算机资源有限,目前只搭建了1 k8s-master节点、1 etcd节点,以及2个node节点,搭建步骤如下:
# 一、环境准备
## 1、机器环境
节点CPU核数必须是 :>= 2核 ,否则k8s无法启动
DNS网络: 最好设置为 本地网络连通的DNS,否则网络不通,无法下载一些镜像
linux内核: linux内核必须是 4 版本以上,因此必须把linux核心进行升级
准备3台虚拟机环境,或者是3台阿里云服务器都可。
k8s-master01: 此机器用来安装k8s-master的操作环境
k8s-master01: 此机器用来安装etcd环境(资源有限,和master供用一个宿主机)
k8s-node01: 此机器用来安装k8s node节点的环境
k8s-node02: 此机器用来安装k8s node节点的环境
## 2、依赖环境
#1、给每一台机器设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#查看主机名
hostname
#配置IP host映射关系
vi /etc/hosts
192.168.202.132 k8s-master01
192.168.202.133 k8s-node01
192.168.202.134 k8s-node02
202.106.0.20
#2、安装依赖环境,注意:每一台机器都需要安装此依赖环境
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip bind-utils gcc
#3、安装iptables,启动iptables,设置开机自启,清空iptables规则,保存当前规则到默认规则
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 置空iptables
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
#4、关闭selinux
#闭swap分区【虚拟内存】并且永久关闭虚拟内存
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#5、升级Linux内核为4.44版本
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#安装内核
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
#注意:设置完内核后,需要重启服务器才会生效。
#查询内核
uname -r
#########################################################################
#6、调整内核参数,对于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
vm.overcommit_memory=1
vm.panic_on_oom=0
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
net.netfilter.nf_conntrack_max=2310720
EOF
#将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf
#7、调整系统临时区 --- 如果已经设置时区,可略过
#设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai
#将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
#7、关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
#8、设置日志保存方式
#1).创建保存日志的目录
mkdir /var/log/journal
#2).创建配置文件存放目录
mkdir /etc/systemd/journald.conf.d
#3).创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
#4).重启systemd journald的配置
systemctl restart systemd-journald
#9、打开文件数调整 (可忽略,不执行)
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
#10、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 -- nf_conntrack_ipv4
EOF
##使用lsmod命令查看这些文件是否被引导
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
```
## 3、搭建etcd部署
#登录k8s-master01服务器
ssh root@k8s-master01
#下载etcd
yum -y install etcd
#配置config
vi /etc/etcd/etcd.conf
#设置如下
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://k8s-master01:2379"
#运行etcd
#设置开机启动 且启动服务
systemctl enable etcd && systemctl start etcd
[root@localhost ~]# netstat -nlp | grep etcd
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 7130/etcd
tcp6 0 0 :::2379
#配置etcd内网信息
#设置 (就像定义一个变量一样)
etcdctl -C http://192.168.202.132:2379 set /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
#获取
etcdctl -C http://192.168.202.132:2379 get /atomic.io/network/config
{"Network":"172.17.0.0/16"}
#注:
172.17.0.0/16这个是节点主机Docker网卡的网段。
/atomic.io/network/config类似定义的变量名,在节点机中Flanneld配置里的FLANNEL_ETCD_PREFIX项对应。
## 4、master服务器上安装服务
#登录master服务器
ssh root@k8s-master01
#安装服务
yum -y install kubernetes-master
#配置config
vi /etc/kubernetes/apiserver
# 配置如下
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://k8s-master01:2379"
#配置config
vi /etc/kubernetes/config
#配置如下
KUBE_MASTER="--master=http://k8s-master01:8080"
#启动apiserver scheduler kuber-controller-manager 服务
systemctl enable kube-apiserver kube-scheduler kube-controller-manager
systemctl start kube-apiserver kube-scheduler kube-controller-manager
[root@localhost ~]# netstat -nlpt | grep kube
tcp6 0 0 :::6443 :::* LISTEN 15190/kube-apiserve
tcp6 0 0 :::10251 :::* LISTEN 15191/kube-schedule
tcp6 0 0 :::10252 :::* LISTEN 15192/kube-controll
tcp6 0 0 :::8080 :::* LISTEN 15190/kube-apiserve
#测试
curl http://192.168.202.132:8080/version
{
"major": "1",
"minor": "5",
"gitVersion": "v1.5.2",
"gitCommit": "269f928217957e7126dc87e6adfa82242bfe5b1e",
"gitTreeState": "clean",
"buildDate": "2017-07-03T15:31:10Z",
"goVersion": "go1.7.4",
"compiler": "gc",
"platform": "linux/amd64"
}
#注:若创建pod认证失败
#修改配置
vi /etc/kubernetes/apiserver
#修改如下文
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
在该行删除ServiceAccount SecurityContextDeny 这2个选项
#重启服务
systemctl restart kube-apiserver
删除pod,重新创建
## 5、部署node服务器
由于部署2个node节点,相同操作步骤,只是配置文件,稍作修改。以一个node节点为例。
#登录k8s-node01节点
ssh root@192.168.202.133
#5.1安装docker
yum -y install docker
#开机自启 并启动
systemctl enable docker && systemctl start docker
#修改config
vi /etc/docker/daemon.json
#设置如下
{"registry-mirrors": ["https://registry.docker-cn.com"]}
#重启
systemctl restart docker
#查看仓库源是否设置成功
docker info
#5.2部署flannel
#安装
yum -y install flannel
#修改配置
vi /etc/sysconfig/flanneld
#修改如下
FLANNEL_ETCD_ENDPOINTS="http://k8s-master01:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
#开机自启并启动服务
systemctl enable flanneld && systemctl restart flanneld
netstat -nlp | grep flanneld
udp 0 0 172.16.253.131:8285 0.0.0.0:*
#5.3安装k8s-node
#安装服务
yum -y install kubernetes-node
#修改配置
vi /etc/kubernetes/config
#修改如下文
KUBE_MASTER="--master=http://k8s-master01:8080"
#修改配置
vi /etc/kubernetes/kubelet
#修改如下
KUBELET_HOSTNAME="--hostname-override=k8s-node01"
KUBELET_API_SERVER="--api-servers=http://k8s-master01:8080"
#启动服务
systemctl enable kubelet kube-proxy && systemctl start kubelet kube-proxy
netstat -ntlp | grep kube
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 7838/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 7842/kube-proxy
tcp 0 0 127.0.0.1:10250 0.0.0.0:* LISTEN 7838/kubelet
tcp 0 0 127.0.0.1:10255 0.0.0.0:* LISTEN 7838/kubelet
tcp6 0 0 :::4194 :::* LISTEN 7838/kubelet
#5.4可能存在的问题
创建pod 节点若出现/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory
#解决方案
yum install *rhsm* -y
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
##6、验证
#登录到master服务器上
#查看节点信息
kubectl get nodes
NAME STATUS AGE
k8s-node01 Ready 33m
k8s-node02 Ready 33m