云主机重新部署k8s

作者: peerless_1024 | 来源:发表于2019-02-27 21:15 被阅读0次

新开了四台centos机子,升级了内核之后,按照如下方式安装,但并未成功

1. 环境配置(所有节点)

  • 1.1 配置hosts文件
[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.16.1.224 master
192.16.1.225 node-1
192.16.1.226 node-2
192.16.1.227 node-3
  • 1.2 禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 1.3 禁用SELINUX
setenforce 0
vi /etc/selinux/config
# SELINUX=disabled
  • 1.4 关闭swap
# 临时关闭swap
# 永久关闭 注释/etc/fstab文件里swap相关的行
swapoff -a
  • 1.5 开启forward
# 开启forward
# Docker从1.13版本开始调整了默认的防火墙规则
# 禁用了iptables filter表中FOWARD链
# 这样会引起Kubernetes集群中跨Node的Pod无法通信
# docker 1806,发现默认策略又改回了ACCEPT,这个不知道是从哪个版本改回的

iptables -P FORWARD ACCEPT

  • 1.6 配置转发相关参数,否则可能会出错
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
# 查看命令
sysctl --system
  • 1.7 可选择项:加载ipvs相关内核模块(用于负载均衡)
# 加载ipvs相关内核模块
# 如果重新开机,需要重新加载
yum install -y ipvsadm
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
lsmod | grep ip_vs
  • 1.8 CNI插件部署(所有节点)
sudo mkdir -p /opt/cni/bin 
cd /opt/cni/bin
# 到release页面下载二进制文件
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
sudo tar -zxvf cni-plugins-amd64-v0.7.1.tgz
  • 1.9 时间同步
#安装ntp: 
yum install -y ntp

#同步时间 (与国家授时中心同步)
ntpdate 0.cn.pool.ntp.org
  • 1.10 配置免密登录

2. 安装Docker(所有节点)

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
# 卸载安装指定版本docker-ce
yum remove -y docker-ce docker-ce-selinux container-selinux
    
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.1.ce-1.el7.centos \
docker-ce-selinux-17.03.1.ce-1.el7.centos

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。但这里通过安装docker 1806,发现默认策略又改回了ACCEPT,这个不知道是从哪个版本改回的,因为1706还是需要手动调整这个策略的。

sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["http://6f2b9229.m.daocloud.io"]
}
EOF
systemctl enable docker && systemctl restart docker

确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT


3. 安装k8s组件

参考了 https://juejin.im/post/5b45d4185188251ac062f27c

  • 3.1 所有节点操作
# 配置源
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

# 安装
yum install -y kubelet-1.11.0 kubeadm-1.11.0 kubectl-1.11.0

# 获取docker的cgroups
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cgroupfs
# 配置kubelet使用国内pause镜像
# 配置kubelet的cgroups
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_DNS_ARGS="--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF

# 启动
systemctl daemon-reload 
systemctl enable kubelet && systemctl start kubelet

  • 3.2 master节点操作
# 1.11 版本 centos 下使用 ipvs 模式会出问题
# 参考 https://github.com/kubernetes/kubernetes/issues/65461

# 生成配置文件
cat >kubeadm-master.config<<EOF
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
api:
  advertiseAddress: 192.16.1.224

controllerManagerExtraArgs:
  node-monitor-grace-period: 10s
  pod-eviction-timeout: 10s

networking:
  podSubnet: 10.244.0.0/16
  
kubeProxy:
  config:
    # mode: ipvs
    mode: iptables
EOF

# 提前拉取镜像
# 如果执行失败 可以多次执行
kubeadm config images pull --config kubeadm-master.config

# 初始化
kubeadm init --config kubeadm-master.config
 kubeadm join 192.16.1.224:6443 --token 169sqg.x15rfmfluchsiitz --discovery-token-ca-cert-hash sha256:a1346a6ef31590f9ad3ac39e93d2b78a8f13b74f510b8cedc4a9df02504f9612
rm -rf $HOME/.kube
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 查看node节点
kubectl get nodes

# 只有网络插件也安装配置完成之后,才能会显示为ready状态
# 设置master允许部署应用pod,参与工作负载,现在可以部署其他系统组件
# 如 dashboard, heapster, efk等
# 这一步选做,表示master节点也可以当工作节点
kubectl taint nodes --all node-role.kubernetes.io/master-

# 下载网络配置
mkdir flannel && cd flannel
wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

# 修改网络配置
# 此处的ip配置要与上面kubeadm的pod-network一致
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

# 修改镜像
image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64

# 这里v0.10.0版有一个bug,需要为启动flannel的daemonset添加toleration,以允许在尚未Ready的节点上部署flannel pod:

tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoSchedule


# 如果Node有多个网卡的话,参考flannel issues 39701,
# https://github.com/kubernetes/kubernetes/issues/39701
# 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,
# 否则可能会出现dns无法解析。容器无法通信的情况,需要将kube-flannel.yml下载到本地,
# flanneld启动参数加上--iface=<iface-name>
    containers:
      - name: kube-flannel
        image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth1

cd /opt/cni/bin
sudo tar -zxvf cni-plugins-amd64-v0.7.1.tgz
# 启动
kubectl apply -f kube-flannel.yml

# 查看
kubectl get pods --namespace kube-system
kubectl get svc --namespace kube-system

# 测试DNS

#启动
kubectl run nginx --replicas=2 --image=nginx:alpine --port=80
kubectl expose deployment nginx --type=NodePort --name=example-service-nodeport
kubectl expose deployment nginx --name=example-service
#查看状态
kubectl get deploy
kubectl get pods
kubectl get svc
kubectl describe svc example-service
#DNS解析
kubectl run curl --image=radial/busyboxplus:curl -i --tty
#正常输出********************************************************
nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
#****************************************************************
nslookup kubernetes
nslookup example-service
curl example-service
#访问测试
# 10.96.59.56 为查看svc时获取到的clusterip
curl "10.96.59.56:80"

# 32223 为查看svc时获取到的 nodeport
http://11.11.11.112:32223/
http://11.11.11.113:32223/

#清理删除
kubectl delete svc example-service example-service-nodeport
kubectl delete deploy nginx curl
  • 忘记初始master节点时的node节点加入集群命令怎么办
# 简单方法
kubeadm token create --print-join-command

# 第二种方法
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

参考教程:
使用kubeadm安装k8s-1.11版本
CentOS-7使用kubeadm安装Kubernetes-1.12.0(how & why)
使用kubeadm安装Kubernetes 1.12
K8S安装注意事项
docker用户过渡到kubectl命令行指南

相关文章

网友评论

    本文标题:云主机重新部署k8s

    本文链接:https://www.haomeiwen.com/subject/gdyquqtx.html