详解Kubeadm部署Kubernetes1.18.X

Kubeadm部署Kubernetes1.18.X

官方文档:

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

1.环境介绍

环境:centos 7.4 + ,docker:19.03.13-ce

硬件需求:CPU>=2c ,内存>=2G

主机名角色IP系统
master1master192.168.157.131centos 7.4
node1worker192.168.157.134centos 7.4
node2worker192.168.157.135centos 7.4
2.配置主机名和hosts
hostnamectl set-hostname --static master1
cat >> /etc/hosts << EOF
192.168.157.131 master1
192.168.157.134 node1
192.168.157.135 node2
EOF
3.添加节点信任关系
ssh-keygen -t rsa 
ssh-copy-id root@192.168.157.131

升级内核(选做)

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装
一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default 0
# 重启机器
sync
reboot
4.关闭SELinux、防火墙
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config
5.关闭Swap分区
1.直接关闭
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 
2.或则备份
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
6.优化内核参数
cat > /etc/sysctl.d/k8s.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 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
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 # 关闭ipv6
net.netfilter.nf_conntrack_max=2310720
EOF

sysctl -p /etc/sysctl.d/k8s.conf
7.设置系统时区
timedatectl set-timezone Asia/Shanghai
8.设置系统时钟同步
yum install ntpdate -y
ntpdate ntp.aliyun.com
echo '0 12 * * * /usr/sbin/ntpdate ntp.aliyun.com' >> /etc/crontab
9.关闭无关的服务
systemctl stop postfix && systemctl disable postfix
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
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
11.部署docker
wget -O /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum repolist
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-19.03.13 -y
systemctl  enable docker --now #启动并设置开机自启
12.安装
12.1添加kubernetes的国内YUM源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
12.2安装kubeadm、kubectl、kubelet

kubeadm: 部署集群用的命令
kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
kubectl: 集群管理工具(可选,只要在控制集群的节点上安装即可)

#列出版本
yum list kubeadm --showduplicates 
#安装指定版本
yum install -y kubelet-1.18.9-0 kubeadm-1.18.9-0 kubectl-1.18.9-0
...
Installed:
	kubeadm.x86_64 0:1.18.9-0                                      		kubectl.x86_64 0:1.18.9-0                                      		kubelet.x86_64 0:1.18.9-0                                      		kubernetes-cni.x86_64 0:0.7.5-0                                     
Dependency Installed:
	cri-tools.x86_64 0:1.13.0-0                                             socat.x86_64 0:1.7.3.2-2.el7                                                         
#设置开机自启
systemctl enable kubelet
12.3kubectl详细信息
[root@master1 packages]# more /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
####
[root@master1 packages]# rpm -ql kubelet 
/etc/kubernetes/manifests
/etc/sysconfig/kubelet
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service
12.4kubeadm详细信息
[root@master1 packages]# rpm -ql kubeadm 
/usr/bin/kubeadm
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
####
[root@master1 packages]# more /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubel
et.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamicall
y
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this fi
le.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

12.5kubectl命令补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
12.6依赖的镜像
#查看指定版本k8s,所需镜像的版本:
[root@k8s-master ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.18.9
k8s.gcr.io/kube-apiserver:v1.18.0
k8s.gcr.io/kube-controller-manager:v1.18.0
k8s.gcr.io/kube-scheduler:v1.18.0
k8s.gcr.io/kube-proxy:v1.18.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
#可以提前将images下载到本机
[root@k8s-master ~]# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.18.9
13.master初始化
13.1kubeadm init初始化

kubeadm初始化的方式有两种,一种通过命令加参数,另一种通过配置文件加载,用 kubeadm config print init-defaults > kubeadm-config.yaml生成配置文件并修改参数,然后kubeadm init --config=kubeadm-config.yaml进行初始化,本文采用第一种。

[root@master1 ~]# kubeadm init --apiserver-advertise-address=192.168.157.131 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.9 --service-cidr=10.1.0.0/16 --pod-network-cidr=192.168.0.0/16 --upload-certs
W1130 12:24:28.711211   30863 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.9
[preflight] Running pre-flight checks
	[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
	[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/
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.1.0.1 192.168.157.131]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master1 localhost] and IPs [192.168.157.131 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master1 localhost] and IPs [192.168.157.131 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W1130 12:24:31.664600   30863 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W1130 12:24:31.665346   30863 manifests.go:225] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 14.502587 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.18" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
0c50c1a5e312f1dbd8b2b3fad3fb359881a758be29af3a9eddfd82f9dc333912
[mark-control-plane] Marking the node master1 as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node master1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: luy95h.h4zpynronfnxmuuw
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.157.131:6443 --token luy95h.h4zpynronfnxmuuw \
    --discovery-token-ca-cert-hash sha256:a9f9a82f6d4b0228c0e9d98fead1857b8b82ff44fd937c2f673d21ff7bf96409 
#########################
    [kubelet] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
    [certificates]生成相关的各种证书
    [kubeconfig]生成相关的kubeconfig文件
    [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
13.2配置kubectl
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看节点,pod

[root@master1 ~]# kubectl get node
NAME      STATUS     ROLES    AGE     VERSION
master1   NotReady   master   5m34s   v1.18.9
[root@master1 ~]# kubectl get pod -A
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-7ff77c879f-gjslc          0/1     Pending   0          5m20s
kube-system   coredns-7ff77c879f-x5hp9          0/1     Pending   0          5m20s
kube-system   etcd-master1                      1/1     Running   0          5m36s
kube-system   kube-apiserver-master1            1/1     Running   0          5m36s
kube-system   kube-controller-manager-master1   1/1     Running   0          5m36s
kube-system   kube-proxy-p646j                  1/1     Running   0          5m20s
kube-system   kube-scheduler-master1            1/1     Running   0          5m36s
#node节点为NotReady,因为corednspod没有启动,缺少网络pod插件
14.node节点加入
[root@node1 ~]# kubeadm join 192.168.157.131:6443 --token luy95h.h4zpynronfnxmuuw     --discovery-token-ca-cert-hash sha256:a9f9a82f6d4b0228c0e9d98fead1857b8b82ff44fd937c2f673d21ff7bf96409
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
15.部署网络插件

集群必须安装网络插件以实现Pod间通信,只需要在Master节点操作,其他Node节点会自动创建相关Pod

[root@master1 ~]# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
[root@master1 ~]# kubectl get node
NAME      STATUS   ROLES    AGE     VERSION
master1   Ready    master   8m37s   v1.18.9
[root@master1 ~]# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-8586758878-mqnl6   1/1     Running   0          98s
kube-system   calico-node-22rjk                          1/1     Running   0          98s
kube-system   coredns-7ff77c879f-gjslc                   1/1     Running   0          8m20s
kube-system   coredns-7ff77c879f-x5hp9                   1/1     Running   0          8m20s
kube-system   etcd-master1                               1/1     Running   0          8m36s
kube-system   kube-apiserver-master1                     1/1     Running   0          8m36s
kube-system   kube-controller-manager-master1            1/1     Running   0          8m36s
kube-system   kube-proxy-p646j                           1/1     Running   0          8m20s
kube-system   kube-scheduler-master1                     1/1     Running   0          8m36s
16.其它
16.1让pod允许调度到master节点

在当前部署的集群中,master节点默认是不参与工作负载的,我们可以配置Tains(污点)让其参与工作负载

##1.查看
[root@master1 ~]# kubectl describe node master1 | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule
##2.打污点
[root@master1 ~]# kubectl taint node master1 node-role.kubernetes.io/master-
node/master1 untainted
[root@master1 ~]# kubectl describe node master1 | grep Taints
Taints:             <none>
##3.还原
[root@master1 ~]# kubectl taint node master1 node-role.kubernetes.io/master=:NoSchedule
node/master1 tainted
[root@master1 ~]# kubectl describe node master1 | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule
16.2从集群中移除节点
###1.将当前移除节点的pod迁移到其他节点
[root@master1 ~]# kubectl drain node1 --delete-local-data --force --ignore-daemonsets
###2.删除节点,删除后 数据就从etcd中清除了(可运行kubectl的任一节点中执行)
[root@master1 ~]# kubectl delete node node-1
###3.重置移除的节点
[root@node1 ~]# kubeadm reset -f
16.3重新生成token,token默认有效时间24h
[root@master1 ~]# kubeadm token create --print-join-command
W1129 23:31:21.612807   70200 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.157.131:6443 --token 82n5pc.fwc1nvrlpkeb2jer     --discovery-token-ca-cert-hash sha256:7d70af2e11487a2ed756610e19c3785930b68ceccbdeb840364915d69ea36572
#--print-join-command可将加入命令打印出来,安装命令重新在新节点上加入即可
#其中ca证书sha256编码hash值获取方式:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值