【k8s学习1】-使用kubeadm工具快速安装kubernetes集群

版本大于1.4的开始引入这个kubeadm工具简化集群的安装过程。安装前防火墙和selllinux要关闭。并修改hostname和/etc/hosts

master   192.168.52.10

node1    192.168.52.11

node2    192.168.52.12

 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux

# 重启永久关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 当前环境临时关闭selinux
setenforce 0

关闭swap分区

# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab

将桥接的IPv4流量传递到iptables的链

# 覆盖写入文件内容
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 配置生效
sysctl --system

时间同步

# 1、安装ntpdate
yum install ntpdate -y
# 2、手动同步时间
ntpdate time.windows.com
ntpdate ntp1.aliyun.com

# 3、定时同步时间任务
echo " */10 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com > /dev/null 2>&1 " \
>> /var/spool/cron/root

(一)安装docker

我这里使用的docker,可以参考我之前docker安装的文章。Docker学习笔记1-在centos服务器上安装docker_温殿飞的博客-CSDN博客

如果要指定版本

yum list docker-ce.x86_64 --showduplicates | sort -r 

yum install -y  docker-ce-cli-18.09.9

yum install -y docker-ce-18.09.9 containerd.io

安装好以后还要做一些配置来适配kubernets。 重启服务。

[root@master ~]#cat <<EOF > /etc/docker/daemon.json 
{
"exec-opts":["native.cgroupdriver=systemd"],
"bip":"172.12.0.1/24",
"registry-mirrors": ["https://0s2uk8va.mirror.aliyuncs.com"]

}
EOF

(二)安装kubeadm

官方文档给的是geogle的网址,但是我们无法访问外网,找到了阿里的yum源。配置方法如下:

kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站

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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


yum makecache fast
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes ###这个是安装最新版的
或者
yum install -y kubeadm-1.18.20-0  kubelet-1.18.20-0   kubectl-1.18.20-0 ###这个是安装指定版本
systemctl enable kubelet && systemctl start kubelet

另外kubeadm需要关闭系统交换区,swapoff -a。

(三)修改kubeadm默认配置,并初始化kubelet服务

kubeadm的初始化控制平面(init)命令和加入节点(join)命令,都可以通过修改配置文件来修改默认参数的值。

kubeadm 配置文件将配置文件以ConfigMap的形式保存到集群里。ConfigMap是以配置文件名为key,内容为value的配置存储文件。在建模用户应用时,用户将ConfigMap作为特殊的volume在pod里挂载。在pod被调度到某个节点时,ConfigMap配置文件会被自动还原到节点本地。这样做的目的是方便后续查询和升级工作。kubeadm config子命令提供了对这组功能的支持。下面是命令说明不是安装步骤。

输出kubeadm init 命令默认参数的内容。

kubeadm config print init-defaults

输出kubeadm join 默认参数内容

kubeadm config print join-defaults

列出kubenets集群所需的镜像列表

kubeadm config images list

拉取相关镜像到本地

kubeadm config images pull

了解到上面的命令之后,我们继续进行安装的步骤,要把所需的镜像下载下来但是直接执行拉取名会报错。这是因为我们无法访问默认配置里的geogle镜像k8s.gcr.io. 

解决的方法就是用国内阿里的镜像,运行的时候可能会报错。

以下是master才需要执行的的,node不需要执行

方法一:

kubeadm config print init-defaults>kubeadm.yaml       ##并做一些修改,然后执行安装

kubeadm config images pull --config=kubeadm.yaml    ##拉取镜像到本地

kubeadm init --config=kubeadm.yaml    初始化kubelet服务

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.52.10 ###注意这里为master物理ip
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master       ##注意这里是你的hostname
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  ###这里改为阿里的镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12   ###这个是自动生成server组件时使用的内部ip地址。
scheduler: {}

方法二

kubeadm init --apiserver-advertise-address=192.168.52.10 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.24.4  --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

执行报错

[ERROR CRI]: container runtime is not running: output: E0823 14:06:02.138306    3154 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
解决方法

  1. mv /etc/containerd/config.toml /tmp/

  2. systemctl restart containerd

kubeadm reset之后,再次执行上述命令又报错

[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
这是是kubelet没有启动成功:提示用下面命令看原因

systemctl status kubelet 

journalctl -xeu kubelet

第二条命令的时候提示

"Failed to create cgroup" err="Cannot set property TasksAccountin

解决方法

 yum update systemd

kubeadm reset之后,再次执行发现校验kubelet服务的时候又出错了并且看进程已经起来了,查看错误信息

 systemctl status kubelet 查看kebelet服务状态一直报node相关的错。

journalctl -xeu kubelet | grep Failed 
"Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"kube-scheduler-k8s-master-12_kube-system(b886b3e01aef1830d12847a83ba1b808)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"kube-scheduler-k8s-master-12_kube-system(b886b3e01aef1830d12847a83ba1b808)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull and unpack image \\\"k8s.gcr.io/pause:3.6\\\": failed to resolve reference \\\"k8s.gcr.io/pause:3.6\\\": failed to do request: Head \\\"https://k8s.gcr.io/v2/pause/manifests/3.6\\\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:41965->[::1]:53: read: connection refused\"" pod="kube-system/kube-scheduler-k8s-master-12" podUID=b886b3e01aef1830d12847a83ba1b808
这个是真的巨坑,因为我安装的是最新版本1.24.0 通过命令kubeadm config images list 查到所需的pause是3.7版本,我们拉取的也是3.7版本,但是把,这个鬼玩意居然报没有3.6的错,这就是个bug。

有两种方法,一个就是下载旧的版本的pause,搜索了好像要改标签比较麻烦。

第二个方法,卸载重装,用老版本kubernetes,我使用的是v1.18.20-0,同样的命令,执行一路顺畅,终于完成了,然后非root用户使用安装提示给的命令配置$HOME/.kube 环境。事实证明新手还是要用老的版本不容易出幺蛾子。

注意安装成功的最后一段文字保留,这个是节点加入的命令。

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

kubeadm join 192.168.52.10:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:1cd547bd275b41ef904b9b8ffbd4380947ef85d02d94394ad5deb7b470b4b8fc

root用户可以使用下面一台命令配置环境变量。这个是给kubectl命令工具用的。

export KUBECONFIG=/etc/kubernetes/admin.conf

可以看到mster节点已经部署成功了

[root@master ~]# kubectl -n kube-system get configmap
NAME                                 DATA   AGE
coredns                              1      65m
extension-apiserver-authentication   6      65m
kube-proxy                           2      65m
kubeadm-config                       2      65m
kubelet-config-1.18                  1      65m
[root@master ~]# 
[root@master ~]# 
[root@master ~]# crictl ps
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead. 
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead. 
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID              POD
d3f1cb3755cd6       43940c34f24f3       About an hour ago   Running             kube-proxy                0                   9abadca260393       kube-proxy-4ghjf
c639fa964bd4f       a31f78c7c8ce1       About an hour ago   Running             kube-scheduler            0                   8827c83b9711a       kube-scheduler-master
b092e297bf823       74060cea7f704       About an hour ago   Running             kube-apiserver            0                   9685046f39d4a       kube-apiserver-master
5baea2075fb29       303ce5db0e90d       About an hour ago   Running             etcd                      0                   55ab367f7a383       etcd-master
3549ed5d01c6a       d3e55153f52fb       About an hour ago   Running             kube-controller-manager   0                   6a3803a740ee1       kube-controller-manager-master

(四)部署node节点并加入集群

注意node节点不要初始化服务,其他步骤一样,配置dockeryum源,配置kubernetsyum源安装docker,kubeadm,kubelet,kubectl,直接安装完以后在node节点执行如下命令

kubeadm join 192.168.52.10:6443 --token abcdef.0123456789abcdef \

    --discovery-token-ca-cert-hash sha256:1cd547bd275b41ef904b9b8ffbd4380947ef85d02d94394ad5deb7b470b4b8fc

也可通过kubeadm token list 查看tocken,可以看到里面有个ttl代表这个是临时的,会过期。

所以我们可以自己生成,生成以后只需要替换token的内容就可以了。

生成新的token使用命令

 kubeadm token create --print-join-command

生成永不过期的token使用

kubeadm token create --ttl 0 --print-join-command

[root@master ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
abcdef.0123456789abcdef   23h         2022-08-25T16:58:58+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
kmt9dl.74h1kuahlr13i1xj   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
zphgy5.2cbwm33v4tkyjrr0   23h         2022-08-25T17:33:18+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

然后到mater服务器上执行kubectl get nodes 可以查看节点。

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   24m     v1.18.20
node1    NotReady   <none>   2m17s   v1.18.20

我们的节点就配置上去了。 

另外也可以使用yaml的方法。

kubeadm config print join-defaults >join.yaml

然后修改配置,已标红

apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.52.10:6443
    token: abcdef.0123456789abcdef
    unsafeSkipCAVerification: true
  timeout: 5m0s
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints: null

接下来就是利用文件加入了

kubeadm join --config=join.yaml

(五)配置CNI网络插件

wget https://docs.projectcalico.org/v3.16/manifests/calico.yaml --no-check-certificate

这个文件要和版本匹配,可以查询cni匹配的版本。

System requirementsReview requirements before installing Calico to ensure success.https://projectcalico.docs.tigera.io/archive/v3.16/getting-started/kubernetes/requirements修改文件内容

               

  修改点一:标红部分为添加
            # Cluster type to identify the deployment type
            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens33"

            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"
修改点二:搜索CALICO_IPV4POOL_CIDR ,改成自己的地址段

            - name: CALICO_IPV4POOL_CIDR
              value: "192.168.52.0/16"
 

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   Ready      master   170m   v1.18.20
node1    Ready   <none>   148m   v1.18.20

状态变成ready就成功了

在master安装完cni再添加节点会出现,可以重新执行下mater安装cni的命令这样node节点也会变正常。

Unable to update cni config: no networks found in /etc/cni/net.d

另外如果node节点的kubelet报下面的错但是查了下这个文件存在,尝试重启docker和kubelet后解决

error: fork/exec /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds/uds: no such file or directory, output: ""

(六)验证集群是否工作正常。

[root@master ~]# kubectl get pod --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-b96cdbbbf-z48xq   1/1     Running   1          14h
kube-system   calico-node-8gqqr                         1/1     Running   1          13h
kube-system   calico-node-94cs7                         1/1     Running   2          14h
kube-system   coredns-7ff77c879f-7h85m                  1/1     Running   1          17h
kube-system   coredns-7ff77c879f-d27lm                  1/1     Running   1          17h
kube-system   etcd-master                               1/1     Running   1          17h
kube-system   kube-apiserver-master                     1/1     Running   1          17h
kube-system   kube-controller-manager-master            1/1     Running   2          17h
kube-system   kube-proxy-p6g5g                          1/1     Running   1          17h
kube-system   kube-proxy-xf54z                          1/1     Running   2          16h
kube-system   kube-scheduler-master                     1/1     Running   2          17h
一切安好,太幸福了。

权威指南里面说,如果有pod错误。

可以通过kubectl --namespace=kube-system describe pod  <pod_name>  来查看。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值