工作中的点点滴滴 2020-02-29
从系统架构来看,k8s分为2个节点 Master 控制节点 指挥官 Node 工作节点 干活的
API Server :提供k8s API接口 主要处理Rest操作以及更新Etcd中的对象 是所有资源增删改查的唯一入口。 Scheduler:资源调度器 根据etcd里的节点资源状态决定将Pod绑定到哪个Node上 Controller Manager 负责保障pod的健康存在 资源对象的自动化控制中心,Kubernetes集群有很多控制器。 Etcd 这个是Kubernetes集群的数据库 所有持久化的状态信息存储在Etcd中
Docker Engine 负责节点容器的管理工作,最终创建出来的是一个Docker容器。 kubelet 安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。 kube-proxy 安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
从逻辑架构上看,k8s分为
Pod Controller Service
POD是k8s的最小单位 POD的IP地址是随机的,删除POD会改变IP POD都有一个根容器 一个POD内可以由一个或多个容器组成 一个POD内的容器共享根容器的网络命名空间 一个POD的内的网络地址由根容器提供
用来管理POD,控制器的种类有很多 - RC Replication Controller 控制POD有多个副本 - RS ReplicaSet RC控制的升级版 - Deployment 推荐使用,功能更强大,包含了RS控制器 - DaemonSet 保证所有的Node上有且只有一个Pod在运行 - StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序
NodeIP 对外提供用户访问 CluterIP 集群内部IP,可以动态感知后面的POD IP POD IP POD的IP
主机名 IP地址 推荐配置 勉强配置 node1 10.0.0.11 1C4G40G 1C2G node2 10.0.0.12 1C2G40G 1C1G node3 10.0.0.13 1C2G40G 1C1G
干净环境 配置主机名 配置host解析 关闭防火墙 关闭SELinux 配置时间同步 更新好阿里源 确保网络通畅 关闭SWAP分区
cd /etc/yum.repos.d/ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
mkdir /etc/docker cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF
systemctl enable docker && systemctl start docker
docker -v
注意!所有机器都需要操作!!!
注意!所有机器都需要操作!!!
注意!所有机器都需要操作!!!
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
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
cat > /etc/sysconfig/kubelet<<EOF KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBELET_EXTRA_ARGS="--fail-swap-on=false" EOF
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 sysctl --system
systemctl enable kubelet && systemctl start kubelet
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 +x /etc/sysconfig/modules/ipvs.modules source /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv
节点规划
node1 master节点 API Server,controlle,scheduler,kube-proxy,kubelet,etcd node2 node节点 Dokcer kubelet kube-proxy node3 node节点 Dokcer kubelet kube-proxy
IP规划
POD IP 10.2.0.0 Cluster IP 10.1.0.0 Node IP 10.0.0.0
注意!只在node1节点运行!!!
注意!只在node1节点运行!!!
注意!只在node1节点运行!!!
官网地址:
https://v1-16.docs.kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
初始化命令:
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集群的命令kubeadm join 10.0.0.11:6443 --token 2an0sn.kykpta54fw6uftgq \ --discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
[ ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION node1 NotReady master 15m v1.16.
yum install bash-completion -y source /usr/share/bash-completion/bash_completion source <(kubectl completion bash) kubectl completion bash >/etc/bash_completion.d/kubectl
执行命令,然后将mode: ""修改为mode: "ipvs"然后保存退出
kubectl edit cm kube-proxy -n kube-system
重启kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
查看pod信息
kubectl get -n kube-system pod|grep "kube-proxy"
检查日志,如果出现IPVS rr就表示成功
[ ~]# kubectl -n kube-system logs -f kube-proxy-7cdbn 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规则
[ ~]# 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
注意!只在node1节点上安装部署!!!
注意!只在node1节点上安装部署!!!
注意!只在node1节点上安装部署!!!
git clone --depth 1 https://github.com/coreos/flannel.git
cd flannel/Documentation/ vim kube-flannel.yml 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
kubectl create -f kube-flannel.yml
[ ~]# 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
kubeadm token create --print-join-command
kubeadm join 10.0.0.11:6443 --token uqf018.mia8v3i1zcai19sj --discovery-token-ca-cert-hash sha256:e7d36e1fb53e59b12f0193f4733edb465d924321bcfc055f801cf1ea59d90aae
kubectl get nodes
[ ~]# kubectl label nodes node2 node-role.kubernetes.io/node= [ ~]# kubectl label nodes node3 node-role.kubernetes.io/node=
[ ~]# 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
###host字段指定授权使用该证书的etcd节点IP或子网列表,需要将etcd集群的3个节点都添加其中。cp etcd-v3.3.13-linux-amd64/etcd* /opt/k8s/bin/