目录
K8s部署
一、实验环境准备
k8s实验环境准备:
配置信息:
主机名 IP地址 推荐配置 勉强配置
node1 10.0.0.11 1C4G40G 1C2G
node2 10.0.0.12 1C2G40G 1C1G
node3 10.0.0.13 1C2G40G 1C1G
初始化操作:
干净环境
关闭防火墙
关闭SELinux
配置时间同步
配置主机名
配置host解析
更新好阿里源
确保网络通畅
软件准备:
harbor离线包
二、k8s系统和组件介绍
#k8s系统架构
从系统架构来看,k8s分为2个节点
Master 控制节点 指挥官
Node 工作节点 干活的
1.Master节点组成
API Server :提供k8s API接口
主要处理Rest操作以及更新Etcd中的对象
是所有资源增删改查的唯一入口。
Scheduler:资源调度器
根据etcd里的节点资源状态决定将Pod绑定到哪个Node上
Controller Manager
负责保障pod的健康存在
资源对象的自动化控制中心,Kubernetes集群有很多控制器。
Etcd
这个是Kubernetes集群的数据库
所有持久化的状态信息存储在Etcd中
2.Node节点的组成
Docker Engine
负责节点容器的管理工作,最终创建出来的是一个Docker容器。
kubelet
安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。
kube-proxy
安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
三、k8s逻辑架构
从逻辑架构上看,k8s分为
Pod
Controller
Service
1.POD
POD是k8s的最小单位
POD的IP地址是随机的,删除POD会改变IP
POD都有一个根容器
一个POD内可以由一个或多个容器组成
一个POD内的容器共享根容器的网络命名空间
一个POD的内的网络地址由根容器提供
2.Controller
用来管理POD
控制器的种类有很多
- RC Replication Controller 控制POD有多个副本
- RS ReplicaSet RC控制的升级版
- Deployment 推荐使用,功能更强大,包含了RS控制器
- DaemonSet 保证所有的Node上有且只有一个Pod在运行
- StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序
3.Service
NodeIP
CluterIP
POD IP
四、安装指定版本的docker
#安装部署docker
1.设置国内YUM源
[root@node1 ~]# cd /etc/yum.repos.d/
[root@node1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看源
[root@node1 yum.repos.d]# ll
总用量 12
-rw-r--r-- 1 root root 1657 2月 25 12:10 CentOS-Base.repo
-rw-r--r-- 1 root root 2640 2月 24 17:15 docker-ce.repo
-rw-r--r-- 1 root root 954 2月 25 12:10 epel.repo
2.安装指定的docker版本
[root@node1 ~]# yum -y install docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7
3.设置docker使用阿里云加速
[root@node1 ~]# mkdir /etc/docker
[root@node1 ~]# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
4.启动后台进程
[root@node1 ~]# systemctl enable docker && systemctl start docker
5.查看docker版本
[root@node1 ~]# docker -v
Docker version 18.09.7, build 2d0083d
涉及到的命令
ipvsadm -Ln #查看ipvs规则
kubectl get pod #查看pod信息
kubectl get pod -o wide #查看pod的详细信息 ip labels
kubectl get pod -n kube-system -o wide #指定查看某个命名空间的pod的详细信息
kubectl get nodes #查看节点信息
kubectl get nodes -o wide #查看节点详细信息
kubectl -n kube-system edit cm kube-proxy #编辑某个资源的配置文件
kubectl -n kube-system logs -f kube-proxy-7cdbn #查看指定命名空间里的指定pod的日志
kubectl create -f kube-flannel.yml #根据资源配置清单创建相应的资源
kubectl delete -f kube-flannel.yml #删除资源配置清单相应的资源
kubeadm reset #重置kubeadm节点
kubeadm token create --print-join-command #打印出node节点加入master节点的命令
kubeadm join 10.0.0.11:6443 --token uqf018.mia8v3i1zcai19sj --discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae #node节点加入master的命令
五、安装部署kubeadm和kubelet
#部署kubeadm和kubelet
注意!所有机器都需要操作!!!
1.设置k8s国内yum仓库
[root@node1 ~]# cat >/etc/yum.repos.d/kubernetes.repo<<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.安装kubeadm
[root@node1 ~]# yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
#注意:如果安装报错,可能网速不好,再执行一遍
3.设置k8s禁止使用swap
[root@node1 ~]# cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
#如果有swap,要注释掉
[root@node1 yum.repos.d]# vim /etc/fstab
4.设置内核参数
[root@node1 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@node1 ~]# sysctl --system
5.设置kubelet开机启动
[root@node1 ~]# systemctl enable kubelet && systemctl start kubelet
6.加载IPVS模块
[root@node1 ~]# 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
[root@node1 ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
[root@node1 ~]# source /etc/sysconfig/modules/ipvs.modules
[root@node1 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 4
ip_vs 145497 10 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4 15053 7
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 133095 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
六、初始化Master节点
初始化集群部署Master
0.安装规划
节点规划
node1 master节点 API Server controlle scheduler kube-proxy etcd
node2
node3
IP规划
POD IP. 10.2.0.0
Cluster IP. 10.1.0.0
Node IP. 10.0.0.0
1.初始化命令
[root@node1 ~]# wget https://v1-16.docs.kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
#注意!只在node1节点运行!!!
[root@node1 ~]# kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
执行完成后会有输出,这是node节点加入k8s集群的命令
===============================================
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
...
kubeadm join 10.0.0.11:6443 --token lb2q8w.knrkzvwg9vp8blqi \
--discovery-token-ca-cert-hash sha256:b094543a3bbf748301b57b04d4722a246413646cbd698e427cbfdc4879f9bcd8
===============================================
2.为kubectl准备kubeconfig(初始化返回结果有显示)
[root@node1 ~]# mkdir -p $HOME/.kube
[root@node1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.获取node节点信息
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 NotReady master 15m v1.16.
4.支持命令补全
[root@node1 ~]# yum install bash-completion -y
[root@node1 ~]# source /usr/share/bash-completion/bash_completion
[root@node1 ~]# source <(kubectl completion bash)
[root@node1 ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
5.设置kube-proxy使用ipvs模式
#执行命令,然后将mode: ""修改为mode: "ipvs"然后保存退出
[root@node1 ~]# kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited
#重启kube-proxy
[root@node1 ~]# kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
#查看pod信息
[root@node1 ~]# kubectl get -n kube-system pod|grep "kube-proxy"
kube-proxy-28rlx 1/1 Running 0 11s
#检查日志,如果出现IPVS rr就表示成功(注意:最后要tab出来)
[root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-7xxxx
I0225 08:03:57.736191 1 node.go:135] Successfully retrieved node IP: 10.0.0.11
I0225 08:03:57.736249 1 server_others.go:176] Using ipvs Proxier.
W0225 08:03:57.736841 1 proxier.go:420] IPVS scheduler not specified, use rr by default
#检查IPVS规则
[root@node1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr
-> 10.0.0.11:6443 Masq 1 0 0
TCP 10.1.0.10:53 rr
TCP 10.1.0.10:9153 rr
UDP 10.1.0.10:53 rr
七、部署网络插件flannel
部署网络插件
1.部署Flannel网络插件
git clone --depth 1 https://github.com/coreos/flannel.git
#或者直接上传软件包
[root@node1 ~]# ll
总用量 7340
-rw-------. 1 root root 1480 2月 24 22:23 anaconda-ks.cfg
-rw-r--r-- 1 root root 7505555 2月 25 16:29 flannel-master.zip
-rw-r--r--. 1 root root 474 2月 24 22:28 host_ip.sh
[root@node1 ~]# unzip flannel-master.zip
2.修改资源配置清单
[root@node1 ~]# ll
总用量 7344
-rw-------. 1 root root 1480 2月 24 22:23 anaconda-ks.cfg
drwxr-xr-x 13 root root 4096 10月 31 23:22 flannel-master
-rw-r--r-- 1 root root 7505555 2月 25 16:29 flannel-master.zip
-rw-r--r--. 1 root root 474 2月 24 22:28 host_ip.sh
[root@node1 ~]# cd flannel-master/Documentation/
#修改之前先备份
[root@node1 Documentation]# cp kube-flannel.yml /opt
[root@node1 Documentation]# vim kube-flannel.yml
[root@node1 Documentation]# egrep -n "10.2.0.0|mirror|eth0" kube-flannel.yml
128: "Network": "10.2.0.0/16",
172: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
186: image: quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
192: - --iface=eth0
3.应用资源配置清单
kubectl create -f kube-flannel.yml
4.检查pod运行状态,等一会应该全是running
[root@node1 ~]# kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-bzlkw 1/1 Running 0 77m
coredns-58cc8c89f4-sgs44 1/1 Running 0 77m
etcd-node1 1/1 Running 0 76m
kube-apiserver-node1 1/1 Running 0 76m
kube-controller-manager-node1 1/1 Running 0 76m
kube-flannel-ds-amd64-cc5g6 1/1 Running 0 3m10s
kube-proxy-7cdbn 1/1 Running 0 23m
kube-scheduler-node1 1/1 Running 0 76m
#注意:如果报错:
在目录里操作:
1: kubectl delete -f kube-flannel.yml
2: cp kube-flannel.yml /opt
3: rm -rf kube-flannel.yml
4: 然后把包拖进来,修改
5: kubectl create -f kube-flannel.yml
6:kubectl -n kube-system get pod
八、kubeadm部署Node节点
部署Node节点
1.在master节点上输出增加节点的命令(这条命令结果和初始化执行结果保存的一样)
[root@node1 Documentation]# kubeadm token create --print-join-command
kubeadm join 10.0.0.11:6443 --token 6a81dl.1h4evnpbmu1phdu6 --discovery-token-ca-cert-hash sha256:b094543a3bbf748301b57b04d4722a246413646cbd698e427cbfdc4879f9bcd8
2.在node2和node3节点执行加入集群的命令 每个人的token不一样
[root@node2 yum.repos.d]# kubeadm join 10.0.0.11:6443 --token 6a81dl.1h4evnpbmu1phdu6 --discovery-token-ca-cert-hash sha256:b094543a3bbf748301b57b04d4722a246413646cbd698e427cbfdc4879f9bcd8
[root@node3 ~]# kubeadm join 10.0.0.11:6443 --token 6a81dl.1h4evnpbmu1phdu6 --discovery-token-ca-cert-hash sha256:b094543a3bbf748301b57b04d4722a246413646cbd698e427cbfdc4879f9bcd8
3.在node1节点上查看状态
[root@node1 Documentation]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 20m v1.16.2
node2 Ready <none> 66s v1.16.2
node3 Ready <none> 61s v1.16.2
4.给节点打标签
[root@node1 Documentation]# kubectl label nodes node2 node-role.kubernetes.io/node=
node/node2 labeled
[root@node1 Documentation]# kubectl label nodes node3 node-role.kubernetes.io/node=
node/node3 labeled
5.再次查看节点状态
[root@node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master 171m v1.16.2
node2 Ready node 27m v1.16.2
node3 Ready node 27m v1.16.2