Kubeadm安裝k8s 1.5.1(無坑)

1、Kuberbetes 平臺環境規劃

機器規劃:

主機名 IP地址
Master01 10.0.0.31
Node01 10.0.0.33
Node02 10.0.0.34

Master節點:etcd、api-server、controlor-manager、scheduler
Node節點:kube-proxy、docker

2、系統初始化

所有節點操作

1.設置系統主機名

hostnamectl set-hostname k8s-master01

2.安裝依賴包

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables \
curl sysstat libseccomp wget net-tools vim git

3.關閉selinux和swap
必須防止k8s運行在虛擬內存中,否則會導致運行緩慢

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

4.設置防火牆爲iptables並設置空規則

systemctl stop firewalld && systemctl disable firewalld && yum -y install iptables-services \
systemctl start iptables && systemctl enable iptables \
iptables -F && service iptables save

5.添加主機名與ip對應關係

cat /etc/hosts 
10.0.0.31 k8s-master01
10.0.0.32 k8s-master02
10.0.0.33 k8s-node01
10.0.0.34 k8s-node02

6.調整內核參數,對於k8s

cat > kubernetes.conf <<EOF
# 將橋接的ipv4流量傳遞到iptables鏈
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 
net.netfilter.nf_conntrack_max=2310720
EOF

cp kubernetes.conf /etc/sysctl.d/kubernetes.conf 
sysctl -p /etc/sysctl.d/kubernetes.conf

7.升級系統內核爲 4.44
CentOS 7.x 系統自帶的 3.10.x 內核存在一些 Bugs,導致運行的 Docker、Kubernetes 不穩定

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 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 8 (Core)'

8.kube-proxy開啓ipvs的前置條件
ipvs:解決svc(service)和pod之間的調度關係,並且性能/功能都比iptables強大很多,

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

3、安裝 Docker 軟件

所有節點安裝

1.添加yum源以及安裝

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

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce

// 啓動docker(啓動後會自動生成/etc/docker目錄,否則需要手動創建)
systemctl start docker 

2.配置daemon.json

cat >/etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://hdi5v8p1.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"], 
  "log-driver": "json-file", 
  "log-opts": { 
        "max-size": "100m" 
    }
}
EOF

// daemon參數解釋
registry-mirrors:Docker鏡像加速

log-driver:Docker用來接收來自容器內部stdout/stderr的日誌的模塊 json-file會將容器日誌存儲在docker host machine的/var/lib/docker/containers/<container id>/<container id>-json.log(需要root權限才能夠讀),既然日誌是存在磁盤上的,那麼就要磁盤消耗的問題。下面介紹兩個關鍵參數:
    - max-size,單個日誌文件最大尺寸,當日志文件超過此尺寸時會滾動,即不再往這個文件裏寫,而是寫到一個新的文件裏。默認值是-1,代表無限。
    - max-files,最多保留多少個日誌文件。默認值是1。

"exec-opts": ["native.cgroupdriver=systemd"]:Docker使用的文件驅動是systemd

3.創建一個存放docker配置文件的目錄

mkdir -p /etc/systemd/system/docker.service.d

4.重啓docker服務並加入開機啓動

systemctl daemon-reload && systemctl restart docker && systemctl enable docker

4、安裝Kubeadm

所有節點統一安裝kubelet kubeadm kubelectl

1.安裝kubelet kubeadm kubelectl
導入阿里雲的yum倉庫

cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
[kubernetes] 
name=Kubernetes 
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 
enabled=1 
gpgcheck=0 
repo_gpgcheck=0 
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

// 指定安裝版本(這裏統一使用1.15.1)
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service

2.初始化Kubermetes master

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

由於默認拉取鏡像地址k8s.gcr.io國內無法訪問,這裏指定阿里雲鏡像倉庫地址。

初始化master節點重要截圖:
Kubeadm安裝k8s 1.5.1(無坑)

使用kubectl工具:

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

3.安裝Pod網絡插件(CNI)

只在master節點操作,當node節點加入的時候也會自動安裝該插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

確保能夠訪問到quay.io這個registery。

master的網絡插件啓動成功:
Kubeadm安裝k8s 1.5.1(無坑)

4.node加入節點
向集羣添加新節點,執行在kubeadm init輸出的kubeadm join命令:

kubeadm join 10.0.0.31:6443 --token 711bqn.ozruisxvcz1924fg \
    --discovery-token-ca-cert-hash sha256:295acb22b65296410968d040cfbb326642d2e3b177ccbc3626765a0ada6fa9ff 

所有節點加入完成

[root@k8s-master01 ~]# kubectl get nodes
NAME           STATUS     ROLES    AGE     VERSION
k8s-master01   Ready      master   12m     v1.15.1
k8s-node01     Ready      <none>   4m39s   v1.15.1
k8s-node02     Ready   <none>   106s    v1.15.1

如果忘了join的命令咋辦?可以使用下面的命令獲取

[root@k8s-master01 ~]# kubeadm token list
TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
711bqn.ozruisxvcz1924fg   23h       2019-11-20T00:19:17+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

5.測試Kubernetes集羣
在Kubernetes集羣中創建一個rc,驗證是否正常運行:

創建一個文件nginx_obj.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 3
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: nginx
        image: nginx:1.13
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30000
    targetPort: 80
  selector:
    app: myweb

指定該文件並創建rc

kubectl  create -f nginx_obj.yaml

查看pod和svc信息

[root@k8s-master01 ~]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
myweb-l4vkm   1/1     Running   0          5s    10.244.1.2   k8s-node01   <none>           <none>
myweb-qdxgp   1/1     Running   0          5s    10.244.3.2   k8s-node02   <none>           <none>

[root@k8s-master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1      <none>        443/TCP        22m
myweb        NodePort    10.1.205.42   <none>        80:30000/TCP   38s

訪問地址:http://NodeIP:30000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章