kubernetes组件架构图:
集群机器
172.16.2.10 k8s-master 172.16.2.11 k8s-node1 172.16.2.12 k8s-node2
#查看Centos版本:
cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)
##https://www.cnblogs.com/liucx/
#修改主机名:
#master节点: hostnamectl set-hostname k8s-master #node1节点: hostnamectl set-hostname k8s-node1 #node2节点: hostnamectl set-hostname k8s-node2
#修改/etc/hosts文件
cat >> /etc/hosts << EOF 172.16.2.10 k8s-master 172.16.2.11 k8s-node1 172.16.2.12 k8s-node2 EOF
#关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0
#关闭swap
swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#Master免密登录其它节点
ssh-keygen ssh-copy-id -i root@k8s-node1 ssh-copy-id -i root@k8s-node2
#安装依赖包
yum -y install epel-release yum -y install ntpdate ipvsadm ipset iptables curl sysstat libseccomp wget
#同步时间
ntpdate ntp.shu.edu.cn crontab -e */5 * * * * ntpdate ntp5.aliyun.com
#修改iptables相关参数
#RHEL / CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题。创建/etc/sysctl.d/k8s.conf文件,添加如下内容:
cat <<EOF > /etc/sysctl.d/k8s.conf vm.swappiness = 0 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF #使配置生效 modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf
#由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
#在所有的Kubernetes节点执行以下脚本:
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
#执行脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
#卸载docker旧版本
yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
#安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum -y install docker-ce systemctl start docker && systemctl enable docker
#配置镜像加速器
cat >/etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } EOF systemctl restart docker
#配置kubernetes的阿里云yun源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF [kubernetes] name=Kubernetes repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg enabled=1 EOF
#安装指定版本kubelet、kubeadm、kubectl
#1.kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
#2.kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
#3.kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
#在所有节点上安装指定版本 kubelet、kubeadm 和 kubectl
yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
#修改docker Cgroup Driver为systemd
#将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
#如果不修改,在添加Node节点时可能会碰到如下错误
# [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/
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl restart docker
#启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
#Master节点执行初始化
kubeadm init \ --apiserver-advertise-address=172.16.2.10 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.17.2 \ --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address:API服务器将通知它正在监听的IP地址,监听的地址为“0.0.0.0”,即本机所有IP地址。 --apiserver-bind-port:API服务器绑定到的端口。(默认:6443) --image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers --ignore-preflight-errors:将错误显示为警告的检查列表进行忽略。例如:“IsPrivilegedUser,Swp”。Value 'all'忽略所有检查中的错误。 --pod-network-cidr:指定pod网络的IP地址范围。如果设置,控制平面将为每个节点自动分配CIDRs。 --service-cidr:为service VIPs使用不同的IP地址。(默认“10.96.0.0/12”)
#上面日志会生成以下信息(重要记录)
kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv \ --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb #默认token的有效期为24小时,当过期之后,该token就不可用了。 #如果后续有nodes节点加入,解决方法如下:重新生成新的token ==> kubeadm token create
#根据上面的输出提示进行操作
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
#执行完之后,再查看nodes节点时,结果如下:
kubectl get nodes
#可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel或者Calico,没有网络各Pod是无法通信的。
#也可以通过检查组件的健康状态
kubectl get componentstatus #componentstatus可简写为cs
#Node节点加入集群
#使用kubeadm join 注册Node节点到Matser
#kubeadm join 的内容,在上面kubeadm init (kubeadm init输出结果的最后写明了) 已经生成好了
#此操作在node节点上进行操作
kubeadm join 172.16.2.10:6443 --token a63pm3.gqg0nc7dphukxohv \ --discovery-token-ca-cert-hash sha256:5bfcffc542f4aecdecb1ad5250d1ac6fe202d0d36433065eb31a83dbe56733eb
#安装网络插件
#一般的网络无法访问quay.io,可以找国内的镜像源,或者从docker hub上拉取flannel的镜像。
#手动拉取flannel镜像
#在集群的所有机器上操作,手动拉取flannel的docker镜像
docker pull easzlab/flannel:v0.11.0-amd64 # 修改镜像名称 docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64 docker rmi easzlab/flannel:v0.11.0-amd64 docker images
#安装flannel
#此操作在Master节点 上进行
#下载flannel资源配置清单
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
#部署完成后,我们可以通过 kubectl get 重新检查 Pod 的状态:
kubectl get pod -n kube-system -o wide #可以看到,所有的系统 Pod 都成功启动了,而刚刚部署的flannel网络插件则在 kube-system 下面新建了一个名叫kube-flannel-ds-amd64-lkf2f的 Pod,一般来说,这些 Pod 就是容器网络插件在每个节点上的控制组件。 再次查看master和node节点状态已经为ready状态 kubectl get nodes
[root@k8s-master ~]# kubectl get pods --all-namespaces #查看所有名称空间的pod,同时可以看到flannel已经正常启动 NAMESPACE NAME READY STATUS RESTARTS AGE default nginx-86c57db685-q884q 1/1 Running 0 7m3s kube-system coredns-9d85f5447-jb8l2 1/1 Running 0 3h38m kube-system coredns-9d85f5447-zx2j5 1/1 Running 0 3h38m kube-system etcd-k8s-master 1/1 Running 0 3h38m kube-system kube-apiserver-k8s-master 1/1 Running 0 3h38m kube-system kube-controller-manager-k8s-master 1/1 Running 0 3h38m kube-system kube-flannel-ds-amd64-2plp7 1/1 Running 0 48m kube-system kube-flannel-ds-amd64-cnlbh 1/1 Running 0 48m kube-system kube-flannel-ds-amd64-zr88r 1/1 Running 0 48m kube-system kube-proxy-44fpd 1/1 Running 0 179m kube-system kube-proxy-5lrvp 1/1 Running 0 3h38m kube-system kube-proxy-c64px 1/1 Running 0 179m kube-system kube-scheduler-k8s-master 1/1 Running 0 3h38m
[root@k8s-master ~]# kubectl get pods -n kube-system #查看名称空间为kube-system的pod
NAME READY STATUS RESTARTS AGE coredns-9d85f5447-jb8l2 1/1 Running 0 3h37m coredns-9d85f5447-zx2j5 1/1 Running 0 3h37m etcd-k8s-master 1/1 Running 0 3h37m kube-apiserver-k8s-master 1/1 Running 0 3h37m kube-controller-manager-k8s-master 1/1 Running 0 3h37m kube-flannel-ds-amd64-2plp7 1/1 Running 0 47m kube-flannel-ds-amd64-cnlbh 1/1 Running 0 47m kube-flannel-ds-amd64-zr88r 1/1 Running 0 47m kube-proxy-44fpd 1/1 Running 0 178m kube-proxy-5lrvp 1/1 Running 0 3h37m kube-proxy-c64px 1/1 Running 0 178m kube-scheduler-k8s-master 1/1 Running 0 3h37m
#测试Kubernetes集群
此操作在master节点 K8S00上进行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get services nginx
#kubernetes集群可能出现pod或node节点状态异常等情况,可以通过查看日志分析错误原因
#查看pod日志
kubectl -n kube-system logs -f <pod name>
#查看pod运行状态及事件
kubectl -n kube-system describe pods <pod name>
完成!