云主机搭建Kubernetes 1.10集群

https://www.cnblogs.com/aubin/p/9284633.html

一、基础环境

云主机

下载软件包

将所有软件下载至/data目录

# 链接:https://pan.baidu.com/s/13DlR1akNBCjib5VFaIjGTQ 密码:1l69
master到node做免密认证
ssh-keygen
ssh-copy-id root@192.168.1.237
ssh-copy-id root@192.168.1.100
ssh-copy-id root@192.168.1.188
设定主机名与host文件
# 分别设定node与master的主机名
hostnamectl set-hostname master
exec bash

# 同步所有主机的hosts文件
vim /etc/hosts
192.168.1.78 master localhost
192.168.1.237 node1
192.168.1.100 node2
192.168.1.188 node3
解决DNS解析localhost

此云主机的DNS解析localhost会解析到一个鬼地址,这是个大坑。kubeadm初始化是会用到localhost。如果你的主机能解析到自己的IP,那么这步可以跳过。如果不能则需要自己搭建一个DNS,将localhost解析到自己。

# 1.检测
[root@node2 ~]# nslookup localhost
Server:     118.118.118.9
Address:    118.118.118.9#53

Non-authoritative answer:
Name:   localhost.openstacklocal
Address: 183.136.168.91

# 2.搭建DNS
yum -y install dnsmasq
cp /etc/resolv.conf{,.bak}
rm -rf /etc/resolv.conf
echo -e "nameserver 127.0.0.1\nnameserver $(hostname -i)" >> /etc/resolv.conf
chmod 444 /etc/resolv.conf
chattr +i /etc/resolv.conf
echo -e "server=8.8.8.8\nserver=8.8.4.4" > /etc/dnsmasq.conf
echo -e "$(hostname -i)\tlocalhost.$(hostname -d)" >> /etc/hosts
service dnsmasq restart

# 3.再次检测
[root@master ~]# nslookup localhost
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   localhost
Address: 192.168.1.78
同步系统时间
ntpdate 0.centos.pool.ntp.org
关闭防火墙
iptables -F
systemctl stop firewalld
systemctl disable firewalld
关闭SELinux & 关闭swap
swapoff -a 
sed -i 's/.*swap.*/#&/' /etc/fstab
setenforce 0
确认时区
timedatectl set-timezone Asia/Shanghai 
systemctl restart chronyd.service 
修改系统参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
安装docker
tar -xvf docker-packages.tar
cd docker-packages
yum -y install local *.rpm
systemctl start docker && systemctl enable docker
配置镜像加速器
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://lw9sjwma.mirror.aliyuncs.com"]
}

systemctl daemon-reload 
systemctl restart docker
配置k8s的yum源
vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
获取kube软件包
cd kube-packages-1.10.1                 # 软件包在网盘中下载    
tar -xvf kube-packages-1.10.1.tar
cd kube-packages-1.10.1
yum -y install local *.rpm 
systemctl start kubelet && systemctl enable kubelet
统一k8s与docker的驱动
# 1.查看docker驱动
 docker info | Cgroup Driver
Cgroup Driver: cgroupfs

# 修改k8s配置文件与docker保持一致
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
导入基础镜像
cd /data
docker load -i k8s-images-1.10.tar.gz 

二、初始化master节点

# 初始化master 指定的版本要与kubeadm版本一致
# kubeadm只给定了最少选项,集群名称等等都没有指定,kubeadm init
[root@master ~]# kubeadm init --kubernetes-version=v1.10.1 --pod-network-cidr=10.244.0.0/16

# 初始化完成后得到如下信息

Your Kubernetes master 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/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.1.78:6443 --token qabol0.c2gq0uyfxvpqr8bu --discovery-token-ca-cert-hash sha256:2237ec7b8efd5a8f68adcb04900a0b17b9df2a78675a7d62b4aef644a7f62c05
# kubeadm join 是node节点加入集群的命令,注意token的有效期
若要通过普通用户使用群集,需要执行以下步骤
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
基本命令
# 查看pods
kubectl get pods


# 查看系统pods 
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY     STATUS     RESTARTS   AGE
etcd-master                      0/1       Pending    0          1s
kube-apiserver-master            0/1       Pending    0          1s
kube-controller-manager-master   0/1       Pending    0          1s
kube-dns-86f4d74b45-d42zm        0/3       Pending    0          8h
kube-proxy-884h6                 1/1       NodeLost   0          8h
kube-scheduler-master            0/1       Pending    0          1s

# 查看集群各组件状态信息
[root@master ~]# kubectl get componentstatuses
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"}   
You have new mail in /var/spool/mail/root

三、node加入集群

# 确保node节点cgroup驱动保持一致
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 命令来自集群初始化之后额显示中
kubeadm join 192.168.1.78:6443 --token v0866r.u7kvg5js1ah2u1bi --discovery-token-ca-cert-hash sha256:7b36794f4fa5121f6a5e309d0e312ded72997a88236a93ec7da3520e5aaccf0e

# master节点查看nodes信息
[root@master data]# kubectl get nodes
NAME      STATUS     ROLES     AGE       VERSION
master    NotReady      master    57m       v1.10.1
node1     NotReady      <none>    27m       v1.10.1
node2     NotReady      <none>    11s       v1.10.1
node3     NotReady   <none>    4s        v1.10.1
You have new mail in /var/spool/mail/root

四、部署网络

部署

flannel官网
flannel下载时不用科学上网,flannel的yml文件会自动去quay.io网站中下载镜像。

# 1.1使用软件包中的flannel,并指pod映射到哪个主机的网卡上面。
vim kube-flannel.yml
command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr","-iface=eth0" ]
# 以下要按顺序创建,先创建rbac,之前没有穿件rbac导致pod正常创建,但是pin不同
kubectl apply -f kube-flannel-rbac.yml
kubectl apply -f kube-flannel.yml
# 后,节点的状态会变为ready
[root@master1 kubernetes1.10]# kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
master    Ready      master    57m       v1.10.1
node1     Ready      <none>    27m       v1.10.1
node2     Ready      <none>    11s       v1.10.1
node3     Ready   <none>    4s        v1.10.1

# 2.从官网下载最新的flannel,k8s1.7+ 直接执行以下命令即可
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel配置文件修改
kube-flannel.yml中指定使用的网段
"Network": "10.244.0.0/16"

默认使用16位掩码,则在各node中都分配一个10.244.0.0/8的网络

五、部署dashboard

kubectl apply -f kubernetes-dashboard-http.yam
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
命令行常用命令
# 查看pod信息,默认显示default名称空间下的pod
[root@master ~]# kubectl get pods
No resources found.

# 指定名称空间写pod
[root@master ~]# kubectl get pods -n kube-system
NAME                                    READY     STATUS    RESTARTS   AGE
etcd-master                             1/1       Running   0          3h
kube-apiserver-master                   1/1       Running   0          3h
kube-controller-manager-master          1/1       Running   0          3h
kube-dns-86f4d74b45-bzbvc               3/3       Running   0          3h
kube-flannel-ds-5ghhj                   1/1       Running   0          2h
kube-flannel-ds-ht4xd                   1/1       Running   0          3h
kube-flannel-ds-kbm5g                   1/1       Running   0          3h
kube-flannel-ds-mlj4r                   1/1       Running   0          2h
kube-proxy-9xxnd                        1/1       Running   0          3h
kube-proxy-n9w5x                        1/1       Running   0          3h
kube-proxy-nkn8c                        1/1       Running   0          2h
kube-proxy-shd6l                        1/1       Running   0          2h
kube-scheduler-master                   1/1       Running   0          3h
kubernetes-dashboard-5c469b58b8-rjfx6   1/1       Running   0          1h


# 显示更详细的pod信息,此时各pod中都运行了一个kube-proxy和flannel容器
-o wide 显示更详细的信息,报错node节点iP、主机名
[root@master ~]# kubectl get pods -n kube-system -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP              NODE
etcd-master                             1/1       Running   0          3h        192.168.1.78    master
kube-apiserver-master                   1/1       Running   0          3h        192.168.1.78    master
kube-controller-manager-master          1/1       Running   0          3h        192.168.1.78    master
kube-dns-86f4d74b45-bzbvc               3/3       Running   0          3h        10.244.0.2      master
kube-flannel-ds-5ghhj                   1/1       Running   0          2h        192.168.1.188   node3
kube-flannel-ds-ht4xd                   1/1       Running   0          3h        192.168.1.78    master
kube-flannel-ds-kbm5g                   1/1       Running   0          3h        192.168.1.237   node1
kube-flannel-ds-mlj4r                   1/1       Running   0          2h        192.168.1.100   node2
kube-proxy-9xxnd                        1/1       Running   0          3h        192.168.1.237   node1
kube-proxy-n9w5x                        1/1       Running   0          3h        192.168.1.78    master
kube-proxy-nkn8c                        1/1       Running   0          2h        192.168.1.100   node2
kube-proxy-shd6l                        1/1       Running   0          2h        192.168.1.188   node3
kube-scheduler-master                   1/1       Running   0          3h        192.168.1.78    master
kubernetes-dashboard-5c469b58b8-rjfx6   1/1       Running   0          1h        10.244.0.3      master

六、kubeadm清空配置

# 清空kubectl
kubeadm reset

# 清空网络信息
ip link del cni0
ip link del flannel.1

七、踩过的那些坑

  • 确保master与node的DNS解析localhost能解析到自己的IP
  • node加入master确保token不过期
  • node确保kubelet正常启动并运行
  • flannel网络要先创建kube-flannel-rbac.ymal再创建 kube-flannel.yml

八、token过期的解决办法

# 1.查看已经存在的token
kubeadm token list

# 2.创建token
kubeadm token create

# 3.查看ca证书的sha256编码
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# 4.node使用新的token加入集群
kubeadm join --token acb123 --discovery-token-ca-cert-hash sha256:efg456  172.16.6.79:6443 --skip-preflight-checks
    # abc123    新创建的Token
    # efg456    证书的sha256编码
    # IP+Port   Master的IP+Port

感谢

分类:  Linux, 自动化运维
<think>好的,我现在需要帮助用户了解如何在CentOS上使用Ansible搭建Kubernetes集群,并将节点加入集群。首先,我要回忆一下Ansible和Kubernetes的基本知识,以及它们结合使用的常见方法。 首先,Ansible是一个自动化工具,可以通过playbook来批量管理多台服务器。Kubernetes集群搭建通常涉及master节点和worker节点的配置,包括安装docker、kubeadm、kubelet等组件,然后初始化master,再让worker节点加入。 用户提供的引用中有几个相关的命令,比如使用Ansible批量安装docker的shell命令,这可能是在安装前的准备工作。还有关于kubelet可能出现的错误,比如没有运行或者配置问题,这提示在安装过程中需要检查kubelet的状态和配置。此外,设置代理和更新kube-proxy的命令可能是在集群配置后的步骤。 接下来,我需要整理搭建Kubernetes集群的步骤,并考虑如何用Ansible实现自动化。可能的步骤包括: 1. 准备环境:所有节点需要满足Kubernetes的要求,比如关闭swap、配置防火墙、设置主机名和hosts文件等。 2. 安装Docker:所有节点都需要安装容器运行时,这里使用Docker。 3. 安装Kubernetes组件:kubeadm、kubectl、kubelet。 4. 初始化Master节点。 5. 加入Worker节点。 6. 配置网络插件,比如Calico。 7. 验证集群状态。 现在要思考如何将这些步骤转化为Ansible的任务。例如,使用Ansible的模块来执行shell命令、复制配置文件、管理服务等。需要编写playbook,可能分为多个角色,比如common(基础配置)、docker、k8s-master、k8s-worker等。 在引用中提到的批量安装docker的命令,可以用Ansible的shell模块执行,但更推荐使用yum模块来安装rpm包。另外,用户引用中的错误提示说明在安装后需要确保kubelet服务正常运行,可能需要使用systemd模块来启用和启动服务。 初始化master节点后,会生成加入集群的命令,需要将这个命令捕获并传递给worker节点执行,这可以通过Ansible的register模块获取输出,然后提取token和ca证书哈希,再在worker节点的playbook中使用。 网络插件的安装可能需要使用kubectl apply命令,可以在master节点上执行,可以通过Ansible的shell模块调用。 可能遇到的问题包括:节点间的通信问题,需要正确配置防火墙;kubelet服务启动失败,需要检查cgroups配置;加入节点时的token过期,需要生成新的token或者调整参数。 用户提供的引用[2]提到kubelet可能由于配置错误或cgroups禁用而不健康,所以在配置过程中需要确保/etc/sysconfig/kubelet中的配置正确,比如添加--cgroup-driver=systemd参数。 引用[4]中的kubectl patch命令用于更新kube-proxy的配置,这可能是在集群维护时的操作,但在初始搭建时可能不需要,不过可以作为后续优化的参考。 现在需要将这些思考整理成一个步骤清晰的指南,结合Ansible playbook的示例,并注意引用相关的参考内容。同时,要生成相关问题,帮助用户进一步学习。</think>### 在CentOS上使用Ansible搭建Kubernetes集群的步骤 #### 1. 环境准备 - **所有节点**需满足以下条件: - CentOS 7/8系统 - 禁用Swap:`swapoff -a` 并注释`/etc/fstab`中的swap行 - 关闭SELinux:`setenforce 0`,修改`/etc/selinux/config`为`disabled` - 开放防火墙端口(如6443、2379-2380等)[^2] - 配置主机名解析:在`/etc/hosts`中添加节点IP与主机名映射 #### 2. 编写Ansible Playbook 创建目录结构: ```bash mkdir -p k8s-ansible/{roles,group_vars} cd k8s-ansible ``` 创建`ansible.cfg`和`hosts`文件: ```ini # ansible.cfg [defaults] inventory = hosts remote_user = root ``` ```ini # hosts [k8s_cluster] k8s-master ansible_host=192.168.1.10 k8s-node1 ansible_host=192.168.1.11 k8s-node2 ansible_host=192.168.1.12 ``` #### 3. 安装Docker(使用Ansible批量操作) ```yaml # roles/docker/tasks/main.yml - name: 安装依赖包 yum: name: yum-utils device-mapper-persistent-data lvm2 state: present - name: 添加Docker仓库 get_url: url: https://download.docker.com/linux/centos/docker-ce.repo dest: /etc/yum.repos.d/docker-ce.repo - name: 安装Docker yum: name: docker-ce-19.03.* state: present - name: 启动并启用Docker服务 systemd: name: docker enabled: yes state: started ``` #### 4. 安装Kubernetes组件 ```yaml # roles/k8s-base/tasks/main.yml - name: 添加Kubernetes仓库 yum_repository: name: kubernetes description: Kubernetes Repo baseurl: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck: no enabled: yes - name: 安装kubeadm/kubelet/kubectl yum: name: ["kubelet-1.23.0", "kubectl-1.23.0", "kubeadm-1.23.0"] state: present - name: 配置cgroup驱动 lineinfile: path: /etc/sysconfig/kubelet line: 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' create: yes - name: 启用kubelet服务 systemd: name: kubelet enabled: yes state: started ``` #### 5. 初始化Master节点 ```yaml # roles/k8s-master/tasks/main.yml - name: 初始化控制平面 shell: | kubeadm init \ --image-repository registry.aliyuncs.com/google_containers \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=192.168.1.10 register: kubeadm_init args: chdir: $HOME creates: /etc/kubernetes/admin.conf - name: 保存join命令 set_fact: join_command: "{{ kubeadm_init.stdout | regex_search('kubeadm join.*') }}" - name: 配置kubectl copy: src: /etc/kubernetes/admin.conf dest: /root/.kube/config remote_src: yes ``` #### 6. 节点加入集群 ```yaml # roles/k8s-node/tasks/main.yml - name: 执行加入集群命令 shell: "{{ hostvars['k8s-master']['join_command'] }}" when: inventory_hostname != 'k8s-master' ``` #### 7. 部署网络插件(Calico) ```yaml - name: 安装Calico网络 shell: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml delegate_to: k8s-master ``` #### 8. 验证集群状态 ```bash ansible k8s-master -m shell -a 'kubectl get nodes' ``` ### 完整Playbook示例 ```yaml # site.yml - hosts: all roles: - docker - k8s-base - hosts: k8s-master roles: - k8s-master - hosts: k8s-node* roles: - k8s-node - hosts: k8s-master tasks: - name: 部署网络插件 shell: kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ``` 执行命令: ```bash ansible-playbook site.yml ``` ### 关键配置说明 1. 使用阿里云镜像加速组件下载(避免国内网络问题) 2. 配置`--cgroup-driver=systemd`保持与Docker一致 3. Calico网络插件需要匹配`--pod-network-cidr`参数 4. 通过`delegate_to`在master节点执行kubectl命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值