上一节开篇,废话了很多,这篇咱们直接进入主题,搞一个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 < 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 < [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 < #!/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 ``` #登录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项对应。 #登录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,重新创建 由于部署2个node节点,相同操作步骤,只是配置文件,稍作修改。以一个node节点为例。 #登录k8s-node01节点 #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 #登录到master服务器上 #查看节点信息 kubectl get nodes NAME STATUS AGE k8s-node01 Ready 33m k8s-node02 Ready 33m## 3、搭建etcd部署
## 4、master服务器上安装服务
## 5、部署node服务器
##6、验证