和我一起學k8s(二)二進位部署一套k8s集群

2020-09-03 DevOps探路者

作者:DevOps旭

來自:DevOps探路者

一、k8s環境準備

1、軟體版本

kubernetes v1.18.8docker v19.03.9-ceEtcd v3.4.9calico

2、伺服器

master 192.168.1.31node1 192.168.1.32node2 192.168.1.33

3、配置主機名

cat >> /etc/hosts <<EOF 192.168.1.31 k8s01 192.168.1.32 k8s02 192.168.1.33 k8s03EOF

4、免密鑰

在k8s-master節點上操作

ssh-keygen -f /root/.ssh/id_rsa -P &39; -qssh-copy-id k8s01ssh-copy-id k8s02ssh-copy-id k8s03

5、安裝依賴

在所有機器上執行

yum install -y epel-release conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget unzip net-tools

6、關閉防火牆、selinux、swap分區

在所有機器上執行

systemctl stop firewalldsystemctl disable firewalldiptables -F && iptables -X && iptables -F -t nat && iptables -X -t natiptables -P FORWARD ACCEPTswapoff -ased -i &\1/g&39;s/^SELINUX=.*/SELINUX=disabled/& 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它vm.overcommit_memory=1 開啟 OOMfs.inotify.max_user_watches=1048576fs.inotify.max_user_instances=8192   fs.file-max=52706963fs.nr_open=52706963net.ipv6.conf.all.disable_ipv6=1net.netfilter.nf_conntrack_max=2310720vm.dirty_bytes=15728640EOFcp kubernetes.conf /etc/sysctl.d/kubernetes.conf 34;kernel:unregister_netdevice: waiting for eth0 to become free. Usage count = 1&34;signing&34;default&34;expiry&34;87600h&34;profiles&34;etcd&34;expiry&34;87600h&34;usages&34;signing&34;key encipherment&34;server auth&34;client auth&34;CN&34;etcd CA&34;key&34;algo&34;rsa&34;size&34;names&34;C&34;CN&34;L&34;Beijing&34;ST&34;Beijing&34;CN&34;etcd&34;hosts&34;192.168.1.31&34;192.168.1.32&34;192.168.1.33&34;key&34;algo&34;rsa&34;size&34;names&34;C&34;CN&34;L&34;BeiJing&34;ST&34;BeiJing& 在k8s01上cat > /opt/etcd/cfg/etcd.conf << EOF34;etcd-1&34;/var/lib/etcd/default.etcd&34;https://192.168.1.31:2380&34;https://192.168.1.31:2379&[Clustering]ETCD_INITIAL_ADVERTISE_PEER_URLS=&34;ETCD_ADVERTISE_CLIENT_URLS=&34;ETCD_INITIAL_CLUSTER=&34;ETCD_INITIAL_CLUSTER_TOKEN=&34;ETCD_INITIAL_CLUSTER_STATE=&34;EOF[Member]ETCD_NAME=&34;ETCD_DATA_DIR=&34;ETCD_LISTEN_PEER_URLS=&34;ETCD_LISTEN_CLIENT_URLS=&34;34;https://192.168.1.32:2380&34;https://192.168.1.32:2379&34;etcd-1=https://192.168.1.31:2380,etcd-2=https://192.168.1.32:2380,etcd-3=https://192.168.1.33:2380&34;etcd-cluster&34;new& 在k8s03上cat > /opt/etcd/cfg/etcd.conf << EOF34;etcd-3&34;/var/lib/etcd/default.etcd&34;https://192.168.1.33:2380&34;https://192.168.1.33:2379&[Clustering]ETCD_INITIAL_ADVERTISE_PEER_URLS=&34;ETCD_ADVERTISE_CLIENT_URLS=&34;ETCD_INITIAL_CLUSTER=&34;ETCD_INITIAL_CLUSTER_TOKEN=&34;ETCD_INITIAL_CLUSTER_STATE=&34;EOF​

創建etcd的systemd

cat > /usr/lib/systemd/system/etcd.service << EOF[Unit]Description=Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]Type=notifyEnvironmentFile=/opt/etcd/cfg/etcd.confExecStart=/opt/etcd/bin/etcd \--cert-file=/opt/etcd/ssl/server.pem \--key-file=/opt/etcd/ssl/server-key.pem \--peer-cert-file=/opt/etcd/ssl/server.pem \--peer-key-file=/opt/etcd/ssl/server-key.pem \--trusted-ca-file=/opt/etcd/ssl/ca.pem \--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \--logger=zapRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.targetEOF​

啟動etcd

systemctl daemon-reloadsystemctl start etcdsystemctl enable etcd​

查看集群狀態

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints=&34; endpoint health

查看當前leader

[root@k8s01 ~]34;https://192.168.1.31:2379,https://192.168.1.32:2379,https://192.168.1.33:2379& githubwget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz

2、部署docker

tar zxvf docker-19.03.9.tgzmv docker/* /usr/bin

3、創建docker的systemd

cat > /usr/lib/systemd/system/docker.service << EOF[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.serviceWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTimeoutStartSec=0Delegate=yesKillMode=processRestart=on-failureStartLimitBurst=3StartLimitInterval=60s[Install]WantedBy=multi-user.targetEOF​

4、創建配置文件

mkdir /etc/dockermkdir /mnt/docker-libcat > /etc/docker/daemon.json << EOF{    &34;: [&34;],    &34;: &34;}EOF​

5、啟動docker

systemctl daemon-reloadsystemctl start dockersystemctl enable docker


雲計算


四、部署kubernetes

1、下載kubernetes最新的二進位文件

wget https://dl.k8s.io/v1.19.0/kubernetes-server-linux-amd64.tar.gztar zvxf kubernetes-server-linux-amd64.tar.gzcd kubernetes/server/binmv kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/binmv kubectl /usr/bin/

2、部署apiserver

34;signing&34;default&34;expiry&34;87600h&34;profiles&34;kubernetes&34;expiry&34;87600h&34;usages&34;signing&34;key encipherment&34;server auth&34;client auth&34;CN&34;kubernetes&34;key&34;algo&34;rsa&34;size&34;names&34;C&34;CN&34;L&34;Beijing&34;ST&34;Beijing&34;O&34;k8s&34;OU&34;System& 生成證書cfssl gencert -initca ca-csr.json | cfssljson -bare ca -​34;CN&34;kubernetes&34;hosts&34;10.0.0.1&34;127.0.0.1&34;192.168.1.31&34;192.168.1.32&34;192.168.1.33&34;kubernetes&34;kubernetes.default&34;kubernetes.default.svc&34;kubernetes.default.svc.cluster&34;kubernetes.default.svc.cluster.local&34;key&34;algo&34;rsa&34;size&34;names&34;C&34;CN&34;L&34;BeiJing&34;ST&34;BeiJing&34;O&34;k8s&34;OU&34;System& 生成證書cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server​34;--logtostderr=false \\--v=2 \\--log-dir=/opt/kubernetes/logs \\--etcd-servers=https://192.168.31.71:2379,https://192.168.31.72:2379,https://192.168.31.73:2379 \\--bind-address=192.168.31.71 \\--secure-port=6443 \\--advertise-address=192.168.31.71 \\--allow-privileged=true \\--service-cluster-ip-range=10.0.0.0/24 \\--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\--authorization-mode=RBAC,Node \\--enable-bootstrap-token-auth=true \\--token-auth-file=/opt/kubernetes/cfg/token.csv \\--service-node-port-range=30000-32767 \\--kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\--kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\--tls-cert-file=/opt/kubernetes/ssl/server.pem \\--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\--client-ca-file=/opt/kubernetes/ssl/ca.pem \\--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\--etcd-cafile=/opt/etcd/ssl/ca.pem \\--etcd-certfile=/opt/etcd/ssl/server.pem \\--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\--audit-log-maxage=30 \\--audit-log-maxbackup=3 \\--audit-log-maxsize=100 \\--audit-log-path=/opt/kubernetes/logs/k8s-audit.log&34;system:node-bootstrapper&34;--logtostderr=false \\--v=2 \\--log-dir=/opt/kubernetes/log \\--leader-elect=true \\--master=127.0.0.1:8080 \\--bind-address=127.0.0.1 \\--allocate-node-cidrs=true \\--cluster-cidr=10.244.0.0/16 \\--service-cluster-ip-range=10.0.0.0/24 \\--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\--root-ca-file=/opt/kubernetes/ssl/ca.pem \\--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\--experimental-cluster-signing-duration=87600h0m0s&34;--logtostderr=false \--v=2 \--log-dir=/opt/kubernetes/log \--leader-elect \--master=127.0.0.1:8080 \--bind-address=127.0.0.1& k8s01cat > /opt/kubernetes/cfg/kubelet.conf << EOFKUBELET_OPTS=& k8s02cat > /opt/kubernetes/cfg/kubelet.conf << EOFKUBELET_OPTS=& k8s03cat > /opt/kubernetes/cfg/kubelet.conf << EOFKUBELET_OPTS=&34;kubelet-bootstrap&34;kubelet-bootstrap& 查看kubelet證書請求kubectl get csr34;--logtostderr=false \\--v=2 \\--log-dir=/opt/kubernetes/log \\--config=/opt/kubernetes/cfg/kube-proxy-config.yml& k8s01cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOFkind: KubeProxyConfigurationapiVersion: kubeproxy.config.k8s.io/v1alpha1bindAddress: 0.0.0.0metricsBindAddress: 0.0.0.0:10249clientConnection: kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfighostnameOverride: k8s01clusterCIDR: 10.0.0.0/24EOF​ k8s03cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOFkind: KubeProxyConfigurationapiVersion: kubeproxy.config.k8s.io/v1alpha1bindAddress: 0.0.0.0metricsBindAddress: 0.0.0.0:10249clientConnection: kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfighostnameOverride: k8s03clusterCIDR: 10.0.0.0/24EOF

生成kube-proxy.kubeconfig文件

cd ~/ssl/kubernetescat > kube-proxy-csr.json << EOF{  &34;: &34;,  &34;: [],  &34;: {    &34;: &34;,    &34;: 2048 },  &34;: [   {      &34;: &34;,      &34;: &34;,      &34;: &34;,      &34;: &34;,      &34;: &34;   } ]}EOFcfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

生成kubeconfig文件

kubectl config set-cluster kubernetes \  --certificate-authority=/opt/kubernetes/ssl/ca.pem \  --embed-certs=true \  --server=http://192.168.1.31:6443 \  --kubeconfig=kube-proxy.kubeconfigkubectl config set-credentials kube-proxy \  --client-certificate=./kube-proxy.pem \  --client-key=./kube-proxy-key.pem \  --embed-certs=true \  --kubeconfig=kube-proxy.kubeconfigkubectl config set-context default \  --cluster=kubernetes \  --user=kube-proxy \  --kubeconfig=kube-proxy.kubeconfigkubectl config use-context default --kubeconfig=kube-proxy.kubeconfig​cp kube-proxy.kubeconfig /opt/kubernetes/cfg/scp kube-proxy.kubeconfig k8s02:/opt/kubernetes/cfg/scp kube-proxy.kubeconfig k8s03:/opt/kubernetes/cfg/

生成systemd管理kube-proxy

cat > /usr/lib/systemd/system/kube-proxy.service << EOF[Unit]Description=Kubernetes ProxyAfter=network.target[Service]EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.confExecStart=/opt/kubernetes/cfg/kube-proxy \$KUBE_PROXY_OPTSRestart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.targetEOF​

啟動並設置開機啟動

systemctl daemon-reloadsystemctl start kube-proxysystemctl enable kube-proxy

7、cni網絡

下載CNI二進位文件

wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgzmkdir -p /opt/cni/bintar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin​

部署cni網絡

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlkubectl apply -f kube-flannel.yml​

8、授權apiserver訪問kubelet

cat > apiserver-to-kubelet-rbac.yaml << EOFapiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: annotations:   rbac.authorization.kubernetes.io/autoupdate: &34; labels:   kubernetes.io/bootstrapping: rbac-defaults name: system:kube-apiserver-to-kubeletrules:  - apiGroups:      - &34;   resources:      - nodes/proxy      - nodes/stats      - nodes/log      - nodes/spec      - nodes/metrics      - pods/log   verbs:      - &34;---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: system:kube-apiserver namespace: &34;roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:kube-apiserver-to-kubeletsubjects:  - apiGroup: rbac.authorization.k8s.io   kind: User   name: kubernetesEOF​kubectl apply -f apiserver-to-kubelet-rbac.yaml​

至此單master的k8s集群部署完畢,下面我去討論多master。

相關焦點

  • 《蹲坑學K8S》之19-5:二進位部署Calico網絡
    二進位部署kubernetes完畢後,查看群集狀態為NotReady,現在開始二進位部署[root@k8s-master ~] kubectl get nodes二、k8s-master ~] curl 192.168.1.1:31261三、部署
  • k8s集群CI/CD集成介紹二:rancher搭建k8s集群環境
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • K8s二進位部署-編譯源碼解決kubelet-client-xxxx證書一年問題
    cpu6核心以上內存15gb以上拉取源碼確保golang版本與源碼版本一致(一般新的不行就往回退個版本)主要為了解決 二進位方式部署Kubernetes的 kubelet-client證書1年的問題(二進位部署其餘證書都是可以在安裝的時候自己配置時間的,
  • 和我一起學k8s(一)初識kubernetes
    不過回顧歷史,在2013年,docker的問世,以其簡練易用的使用方式,極大的降低了容器的使用門檻,但是由單機走向集群已成為必然,隨後kubernetes橫空出世,並且由Google聯合20多家公司一起創立了CNCF(Cloud Native Computing Foundation,雲原生計算基金會),一起推廣kubernetes,開創了雲原生的新時代。
  • 半小時搭建一套帶Dashboard的kubernetes(K8S)集群
    K8S)是用於自動部署、擴展和管理容器化(containerized)應用程式的開源系統。系統由Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用。它旨在提供「跨主機集群的自動部署、擴展以及運行應用程式容器的平臺」。它支持一系列容器工具, 包括Docker等。
  • Kubernetes 1.14 二進位集群安裝
    Kubernetes 1.14 二進位集群安裝Kubernetes本系列文檔將介紹如何使用二進位部署Kubernetes v1.14集群的所有部署,而不是使用自動化部署(kubeadm)集群。在部署過程中,將詳細列出各個組件啟動參數,以及相關配置說明。在學習完本文檔後,將理解k8s各個組件的交互原理,並且可以快速解決實際問題。
  • k8s集群CI/CD集成介紹三:rancher應用部署
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • k8s二進位部署方式集群中添加admin帳號並籤發證書生成config文件
    >39;EOF&34;CN&34;admin&34;hosts&34;key&34;algo&34;rsa&34;size&34;names&34;C&34;CN&34;ST&34;beijing&34;L&34;beijing&34;O&34;od&34;OU&34;ops&生成集群配置文件
  • Kind + Docker 一鍵部署K8s集群
    時下網際網路最火的技術無非是容器雲和AI,而虛擬雲技術方面最火則是docker和K8S。docker學習和實踐都很容易,但是K8S的由於集群化,部署需要較多的機器,環境搭建學習實踐比較費勁這一度影響了K8S技術的普及。
  • k8s快速通關秘籍(1)
    K8s的快速崛起大大加快了應用程式的工作負載從第3代虛擬機向第4代容器的遷移速度,K8s不僅提供容器編排,部署和管理功能,而且也是CNCF基金會第一個畢業的項目,代表其成熟和穩定性已達到生產環境的標準,當前推薦部署在生產環境的k8s版本是1.14.6。
  • 一起學習rancher-04-安裝kubernetes集群
    一起學習rancher系列: 一、環境準備系統版本:centos7.7Rancher版本:2.5.1K8s版本:1.19.3準備了4臺機器Rancher server:192.168.201.2k8s集群機器
  • k8s集群搭建
    kubeadmkubeadm 是官方社區推出的一個用於快速部署 kubernetes 集群的工具。將一個Node節點加入到當前集群中kubernetes join <Master節點的IP和埠>前置要求一臺或多臺機器,作業系統CentOS7.x-86 _x64
  • 我司基於K8s高可用集群架構
    第一次部署服務在k8s集群環境的時候可能需要:創建namespace、創建imagepullsecret、創建pv(storageclass)、創建deployment(pod controller)、創建svc、創建ingress、等。
  • k8s集群CI/CD集成介紹四:Jenkins部署應用到rancher集群
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • k8s集群CI&CD集成介紹四:Jenkins部署應用到rancher集群
    由於內容過多,本文將分多章介紹k8s集群構建過程,並發布demo到k8s集群,簡單演示一個完整CI/CD的自動化過程。各章節內容如下:  一、k8s集群環境準備  二、rancher搭建k8s集群環境  三、rancher應用部署  四、Jenkins部署應用到rancher集群  部署資源  centos7.7虛擬機3臺,對應ip如下:  - 192.168.0.110- 192.168.0.111- 192.168.0.112
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-k8s安裝與部署
    上一章我們介紹了k8s的核心組件,了解了這些,我們就可以開始k8s的安裝和部署了。來吧,動手吧!準備好兩伺服器(系統是centos7.3),分別作為matser和node,如下:要讓k8s能夠管理我們的集群,需要在所有的節點上面分別安裝k8s的組件。在安裝之前,需要在兩臺節點上做如下的操作。
  • 使用kubeadm的方式搭建K8S高可用集群
    ,我自己測試的話就用kubeadm單master版,公司用的話就用二進位搭建的。)、配置主機名,以k8s-master01為例hostnamectl set-hostname k8s-master01(1)、配置主機hosts映射10.1.10.100 k8s-master0110.1.10.101 k8s-master0210.1.10.102&
  • 國內快速部署kubernetes集群的最佳實踐(二)——安裝指定版本
    在上一篇文章中(),已經說明了如何使用kubeadm安裝最新穩定版k8s本文探討如何在上一篇教程的基礎上,修改一些步驟,實現安裝指定版本的k8s,並在這裡提供兩個示例:安裝k8s v1.16和k8s v1.14。
  • 一起學習rancher-03-新版2.5.1和導入k8s
    一起學習rancher系列: 前面文章已經了解了rancher基本操作,我後面實驗還是以2.5為主,符合趨勢。一、Rancher2.*介紹Rancher 1.x 最初是為了支持多種容器編排引擎而構建的,其中包括自己的容器編排引擎 Cattle。
  • k8s集群CI/CD集成介紹一:環境準備
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。