Site blog

Page: () 1 2 3 4 5 ()
Picture of Mats Johannesson
by Mats Johannesson - Tuesday, 5 May 2020, 1:53 PM
Anyone in the world

Lomma hamn


Den 18-19 maj kör Edument AB .easec:s kurs Orkestrering i Docker online!


Läs mer här: https://www.edument.se/product/orkestrering-i-docker

Comments

     
    Anyone in the world

    Inlägget beskriver hur du arbetar med Azure Active Directory genom att använda Graph-module. Instruktionerna kommer från .easec:s kurs Office 365 för administratören


    Arbetsuppgift 1: Installera modul

    1. Högerklicka på Start-knappen och välj alternativ Windows PowerShell (Admin).

    2. I dialogfönstret User Account Control, klicka på Yes.

    Install-Module -Name AzureAD

    3. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att installera modul för hantering av användare och grupper:

                      Install-Module -Name AzureAD


     Skriv in ett Y och klicka på ENTER, för frågan om Untrusted repository.


    Get-Module AzureAD


    4. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att modul har installerats:

                      Get-Module AzureAD


    Arbetsuppgift 2: Anslut till Azure AD för din Office 365 tenant

    Connect-AzureAD

    1. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                       Connect-AzureAD


    2. Skriv in E-post adress för ditt administratörskonto, klicka på Nästa.

    3. Skriv in ditt lösenord och klicka på Logga in.

    Detaljer Azure AD

    4. Detaljer om tenant visas i fönstret Administrator: Windows PowerShell.

     

    Arbetsuppgift 3: Hantera användare med Graph

    Get-AzureADUser

    1. I fönstret Administrator: Windows Powershell, skriv in följande kommando och klicka på Enter:

                       Get-AzureADUser


    Användare som visas på bilden, är användare som skapas i kursen dels med det grafiska gränssnittet och dels med traditionella Windows PowerShell cmdlets.

    Get-AzureUser -ObjectID

    2. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                       Get-AzureADUser -ObjectID annikap@easecxxyy.onmicrosoft.com


    I .easec:s kurs skapas tenant i Office 365 med namnet easecxxyy, där xx står för veckonummer och yy för deltagarens initialer.

    Get-AzureADUser -objectID Select-Object

    3. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att visa specifika egenskaper:

                       Get-AzureADUser -ObjectID annikap@easecxxyy.onmicrosoft.com | Select-Object DisplayName,UserPrincipalName, AccountEnabled


    4. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                        Get-AzureADUser -ObjectID annikap@easecxxyy.onmicrosoft.com | Get-Member


    Allra först listas ett antal metoder (Windows PowerShell är ett programmeringsspråk som är av typen objektorienterat), därefter ett antal egenskaper (property). Dessa egenskaper kan du visa exempelvis genom att använda cmdlet Format-Table, men även om de andra cmdlets för formatering av utdata används eller för att undersöka cmdlets när skript skall tillverkas.


    Set-AzureAD

    5. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                        Get-AzureADUser -ObjectID annikap@easecxxyy.onmicrosoft.com | Set-AzureADUser -Department Ekonomi


    Get-AzureADUser Where-Object

    6. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                       Get-AzureADUser | Where-Object {$_.Department -eq "Ekonomi"} 


    {$_.Department …} betyder just detta objekt, som skall undersökas.


    Arbetsuppgift 4: Skapa och ta bort användare med Graph

    $PasswordProfile

    1. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att skapa profil för lösenord:

                       $PasswordProfile=New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile

    Kommandot kommer att göra en kopia (instansiera) av klassen Microsoft.Open.AzureAD.Model.PasswordProfile.

    $PasswordProfile.Password

    2. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att lägga till lösenord:

                       $PasswordProfile.Password="Pa55w.rd"


    Egenskap (Password) för vår kopierad klass sätt  och tilldelas ett värde.

    New-AzureADUser

    3. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att skapa nytt konto:

                       New-AzureADUser -DisplayName "Marcus Rosenberg"  -GivenName "Marcus" -SurName "Rosenberg"  

                       -UserPrincipalName marcusr@easecxxyy.onmicrosoft.com -UsageLocation SE -MailNickName macrusr

                       -PasswordProfile $PasswordProfile -AccountEnabled $true

    Get-AzureADUser

    4. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att kontot skapades:

                       Get-AzureADUser


    Notera att konto för Marcus Rosenberg finns med.

    Remove-AzureADUser

    5. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att plocka bort konto du precis skapade:

                       Remove-AzureADUser -ObjectID marcusr@easecxxyy.onmicrosoft.com

    Remove-AzureADUser

    6. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att kontot är borta:

                      Get-AzureADUser


    Arbetsuppgift 4: Skapa användare från CSV-fil

    CSV-fil med användare

    1. Öppna Anteckningarna, skriv in följande (ersätt xxyy med dina parametrar):

                       UserPrincipalName, DisplayName, MailNickName

                       marcusr@easecxxyy.onmicrosoft.com, Marcus Rosenberg, marcusros

                       gullanh@easecxxyy.onmicrosoft.com, Gullan Holm, gullanhol

                       jonasn@easecxxyy.onmicrosoft.com, Jonas Nydahl, jonasnyd

     

    Spara undan filen med namnet anv.csv i C.\Easec (skapa katalogen om inte den finns, glöm inte att markera All Files (*.*) ).

    $Anvpassword

    2. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                      $Anvpassword = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile

    $Anvpassword.Password

    3. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                      $Anvpassword.Password = ”Pa55w.rd”

    Import-Csv

    4. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                      Import-Csv -Path C:\Easec\anv.csv | foreach {New-AzureADUser -UserPrincipalName $_.UserPrincipalName   

                      -DisplayName $_.DisplayName -MailNickName $_.MailNickName -PasswordProfile $Anvpassword -AccountEnabled 

                      $true}

    Get-AzureADUser nya användare

    5. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att kontot är borta:

                      Get-AzureADUser


    Notera att de nya användarna finns med.


    Arbetsuppgift 5: Hantera grupper med Graph

    Get-AzureADGroup

    1. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att lista grupper:

                       Get-AzureADGroup

    New-AzureADGroup

    2. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att skapa ny grupp:

                       New-AzureADGroup -Description "Support" -DisplayName "Support" -MailEnabled $false -SecurityEnabled $true 

                       -MailNickName "Support"


    Uppdatera grupp är en tvåstegsprocess, först måste ObjectId inhämtas, sedan uppdatera gruppen.

    Get-AzureADGroup -Filter

    3. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att inhämta ObjectId:

                       Get-AzureADGroup -Filter "DisplayName eq  'Support'"

    Set-AzureADGroup

    4. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att uppdatera med ny information:

                       Set-AzureADGroup -ObjectId <Object-Id> -Description "Användare på supportavdelningen"

    Get-AzureADGroup -Filter

    5. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera uppdateringen:

                       Get-AzureADGroup -Filter "DisplayName eq  'Support'"

     

    Lägga till användare i gruppen, innehåller tre moment: skapa variabel som innehåller information om grupp, skapa variabel som innehåller information om specifik användare, uppdatera medlemskapet. Gruppägare sätts med liknande teknik, cmdlet Add-AzureADGroupOwner används istället. För att ta bort ägare, använd cmdlet Remove-AzureADGroupOwner,

    $ObjectGroup

    6. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att skapa variabel med gruppinformation:

                        $ObjectGroup = Get-AzureADGroup -SearchString "Support"

    $ObjectIdUser

    7. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                        $ObjectIdUser = Get-AzureADUser -ObjectId karlh@easecxxyy.onmicrosoft.com

    Användare Karl Hult skapas i .easec:s kurs,

    Add-AzureGroupMember

    8. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att lägga till användare Karl Hult i gruppen support:

                        Add-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId -RefObjectId $ObjectIdUser.ObjectId

    Get-AzureADGroupMember

    9. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att användare har lagts till i gruppen:

                        Get-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId

    $ObjectIdUser2

    10. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter:

                        $ObjectIdUser2 = Get-AzureADUser -ObjectId kristinao@easecxxyy.onmicrosoft.com

    Add-AzureAddGroupMemeber_-ObjectId

    11. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att lägga till användare Karl Hult i gruppen support:

                        Add-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId -RefObjectId $ObjectIdUser2.ObjectId

    Get-AzureGroupMember

    12. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att användare har lagts till i gruppen:

                        Get-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId

    Remove-AzureADGroupMember

    13. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att ta bort användare Karl Hult från gruppen Support:

                        Remove-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId -MemberId $ObjectIdUser.ObjectId

    Get-AzureADGroupMember

    14. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att verifiera att användare har tagits bort från gruppen:

                        Get-AzureADGroupMember -ObjectId $ObjectGroup.ObjectId

    Get-AzureADUserMembership

    15. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att lista vilken eller vilka grupper som användare är medlem i (Kristina Olsson):

                         Get-AzureADGroupMembership -ObjectId $ObjectIdUser2.ObjectId


    Arbetsuppgift 5: Avsluta anslutningen

     

    1. I fönstret Administrator: Windows PowerShell, skriv in följande kommando och klicka på Enter, för att avsluta anslutning till AzureAD:

                          Disconnect-AzureAD



    [ Modified: Sunday, 31 May 2020, 9:15 PM ]

    Comments

       
      Anyone in the world

      sudo kubectl --kubeconfig


      Installera worker

      Miljö

      Rollen worker för Kubernetes kommer att installeras på easec-linux4, easec-linux5 och easec-linux6.

      I .easec:s miljö är Docker redan installerat, i din miljö får du installera Docker och konfigurera Docker. För att konfigurera Docker för systemd och overlay2, se mitt blogginlägg: https://portal.easec.se/moodle/blog/index.php?entryid=43

       

      Arbetsuppgift 1: Installera kubeadm, kubelet och kubectl

      1. Anslut till Easec-Linux8 och logga på som easec med lösenordet Pa$$w0rd.

      2. På Easec-Linux8 öppna terminalfönstret (ctrl+alt+t) och skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux1:

                          ssh easec-linux4

      Om det är första gången du ansluter till easec-linux4, skriv in yes och klicka på Enter. Ange Pa$$w0rd som lösenord.

      curl -s

      3. För att lägga till signeringsnyckel för Kubernetes, skriv in följande kommando och klicka på Enter:

                          curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

      Ange Pa$$w0rd som lösenord för sudo.

      sudo apt-add-repository

      4. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att lägga till referens till förråd:

                          sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

      5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att lägga uppdatera referenser:

                          sudo apt-get update

      sudo apt-get install

      6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att installera kubeadm kubelet och kubectl:

                          sudo apt-get install -y kubeadm kubelet kubectl

      7. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att säkerställa att kubeadm, kubelet och kubectl inte uppdateras:

                          sudo apt-mark hold kubeadm kubelet kubectl

      8. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att stänga av swap och göra detta permanent:

                          sudo swapoff -a && sudo sed -i '/ swap / s/^/#/' /etc/fstab

      9. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutning till easec-linux4:

                          exit

      5.     Gör om punkt 2 – 9 för easec-linux5 respektive easec-linux6.

       

      Arbetsuppgift 2: Initiera noder

      scp ~/anslutning.txt

      1. På Easec-Linux8, i terminalfönstret, skriv in följande kommando och klicka på Enter, för att kopiera filen anslutning.txt till easec-linux4, easec-linux5 och easec-linux6:

                          scp ~/anslutning.txt easec@192.168.1.24:~ && scp ~/anslutning.txt easec@192.168.1.25:~ && scp ~/anslutning.txt                          easec@192.168.1.26:~  

       Är det första gången du ansluter, får du skriva in yes och klicka på Enter. Ange Pa$$w0rd som lösenord.

      2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux4:

                          ssh easec-linux4

       Ange Pa$$w0rd som lösenord.

      3. I terminalfönstret, skriv in följande kommando och klicka på Enter:

                          nano anslutning.txt

      Kopiera anslutningskommando

      4. Markera nedre raderna som börjar med sudo kubeadm join (under raden "Then you can join any number of worker nodes … ", högerklicka och välj Kopiera. Klicka på ctrl+x för att avsluta nano.

      5. Högerklicka först i terminalfönstret och välj klistra in.

      sudo kubeadm join

      6. Klicka på Enter, ange Pa$$w0rd som lösenord för sudo.

      7. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutningen till easec-linux4:

                           exit

      8. Gör om punkt 2 – 7 för easec-linux5 respektive easec-linux6.


      Arbetsuppgift 3: Verifiera noder

      1. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux1 (masternod):

                           ssh easec-linux1

       Ange Pa$$w0rd som lösenord.

      sudo kubelet --kubconfig

      2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att verifiera att du har sex noder, av dessa är tre master:

                           sudo kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes

       Ange Pa$$w0rd som lösenord för sudo.


      I .easec:s tvådagars workshop fortsätter vi konfigurationen med:

      - Installation av overlay network.

      - Installation av klient på easec-linux8.

      - Installation av dashboard.

      - Installation av registry.

      Andra dagen sätter du upp det andra alternativet med extern klustrad etcd.

      Två tilläggsdagar erbjuds:

      - Kubernetes i molntjänst (aws, Azure eller Google).

      - Övervakning.



      [ Modified: Friday, 20 March 2020, 11:57 AM ]

      Comments

         
        Picture of Mats Johannesson
        by Mats Johannesson - Thursday, 19 March 2020, 11:10 AM
        Anyone in the world

        miljö

        Installera master


        Masterrollen för Kubernetes kommer att installeras på easec-linux1, easec-linux2 och easec-linux3.

        I .easec:s miljö är Docker redan installerat, i din miljö får du installera Docker och konfigurera Docker. För att konfigurera Docker för systemd och overlay2, se mitt blogginlägg: https://portal.easec.se/moodle/blog/index.php?entryid=43

         

        Arbetsuppgift 1: Installera kubeadm, kubelet och kubectl

        1. Anslut till Easec-Linux8 och logga på som easec med lösenordet Pa$$w0rd.

         2. På Easec-Linux8 öppna terminalfönstret (ctrl+alt+t) och skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux1:

                              ssh easec-linux1

         Ange Pa$$w0rd som lösenord.

        curl krypteringsnyckel

        3. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att lägga till signeringsnyckel för Kubernetes:

                              curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

        Ange Pa$$w0rd som lösenord för sudo.

        sudo apt-add-repository

        4. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att lägga till referens till förråd:

                              sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

        5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att uppdatera referenser:

                              sudo apt-get update

        sudo apt-get install

        6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att installera:

                              sudo apt-get install -y kubeadm kubelet kubectl

        sudo apt-mark

        7. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att säkerställa att kubeadm kubelet och kubectl inte uppdateras:

                              sudo apt-mark hold kubeadm kubelet kubectl

        sudo swapoff

        8. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att stänga av swap och göra detta permanent:

                              sudo swapoff -a && sudo sed -i '/ swap / s/^/#/' /etc/fstab

        9. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutning till easec-linux1:

                              exit

        10. Gör om punkt 2 – 9 för easec-linux2 respektive easec-linux3.


        Arbetsuppgift 2: Initiera masternoder

        1. På Easec-Linux8, i terminalfönstret, skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux1:

                               ssh easec-linux1

         Ange Pa$$w0rd som lösenord.

         2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa konfigurationsfil (notera att denna funktion fortfarande är i beta och kan förändras!):    Konfigurationsfil finns här: https://github.com/easec/cluster/blob/master/stacked/config.yaml

                                nano config.yaml

        nano config.yaml

        3. I fönstret med nano, skriv in följande:

                                apiVersion: kubeadm.k8s.io/v1beta2

                                kind: ClusterConfiguration

                                kubernetesVersion: stable

                                apiServer:

                                certSANs:

                                - "192.168.1.27"

                                controlPlaneEndpoint: "192.168.1.27:6443"

                                etcd:

                                external:

                                endpoints:

                                - https://192.168.1.21:2379

                                - https://192.168.1.22:2379

                                - https://192.168.1.23:2379

                                caFile: /etc/etcd/ca.pem

                                certFile: /etc/etcd/kubernetes.pem

                                keyFile: /etc/etcd/kubernetes-key.pem

                                networking:

                                podSubnet: 10.30.0.0/24

        Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

        sudo kubeadmin

        4. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att initiera första nod:

                                sudo kubeadm init --config=config.yaml

        Skriv in Pa$$w0rd som lösenord för sudo. Detta kommer att ta en stund!

        Klart

        Bild ovan visas när det är klart!

        sudo scp

        5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att kopiera certifikat till de andra noderna:

                                sudo scp -r /etc/kubernetes/pki easec@192.168.1.22:~ && sudo scp -r /etc/kubernetes/pki easec@192.168.1.23:~

         Ange Pa$$w0rd som lösenord för sudo.

        6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutning till easec-linux1:

                                 exit

         7. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux2:

                                 ssh easec-linux2

         Ange Pa$$w0rd som lösenord.

         8. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ta bort certifikat och nyckel för api-server:

                                 rm ~/pki/apiserver.*

        sudo mv

        9. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att flytta certifikat till katalogen /etc/kubernetes/:

                                 sudo mv ~/pki /etc/kubernetes/

        10. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa konfigurationsfil:

                                 nano config.yaml

        11. I fönstret med nano, skriv in följande:

                                 apiVersion: kubeadm.k8s.io/v1beta2

                                 kind: ClusterConfiguration

                                 kubernetesVersion: stable

                                 apiServer:

                                 certSANs:

                                 - "192.168.1.27"

                                 controlPlaneEndpoint: "192.168.1.27:6443"

                                 etcd:

                                 external:

                                 endpoints:

                                 - https://192.168.1.21:2379

                                 - https://192.168.1.22:2379

                                 - https://192.168.1.23:2379

                                 caFile: /etc/etcd/ca.pem

                                 certFile: /etc/etcd/kubernetes.pem

                                 keyFile: /etc/etcd/kubernetes-key.pem

                                 networking:

                                 podSubnet: 10.30.0.0/24

        Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

        sudo kubeadm

        12. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att initiera andra noden:

                                 sudo kubeadm init --config=config.yaml

         Skriv in Pa$$w0rd som lösenord för sudo. Precis som för easec-linux1 kommer detta att ta en stund!

        sudo kubeadm del 2

        Bild ovan visas när det är klart!

        13. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutningen till easec-linux2:

                                 exit

        14. Gör om punkt 7 – 12, för att initiera tredje noden. Innan du fortsätter med nästa steg, gör följande när du är ansluten till easec-linux3:

        Kopiera

        a. Markera textraderna som börjar med ”You can now join ..” enligt bild ovan, högerklicka och välj Kopiera.

        b. Öppna Textredigeraren och klistra in texten.

        lägg till sudo

        c. Lägg till sudo innan kubeadm, både för control-plane nodes och för worker nodes, spara filen med namnet anslutning.txt.

        15. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta anslutningen till easec-linux3:

                                 exit




        [ Modified: Thursday, 19 March 2020, 12:06 PM ]

        Comments

           
          Anyone in the world

          Officiell konst Lindängen, Malmö


          Inlägget beskriver hur du konfigurerar Docker att använda systemd och overlay2


          Arbetsuppgift 1: Modifiera /etc/docker/daemon.json

          1. Öppna terminalfönster (ctrl+alt+t), skriv in följande kommando och klicka på Enter:

                             sudo nano /etc/docker/daemon.json

           Ange lösenord för sudo och klicka på Enter.

          sudo nano /etc/docker/daemon.json


          2. I fönstret för nano, gör följande förändringar (exempel visar även hur konfiguration av DNS för containers görs):

                             {

                                        "dns": ["8.8.8.8 ", "8.8.4.4 "],

                                        "exec-opts": ["native.cgroupdriver=systemd"],

                                        "log-driver": "json-file",

                                        "log-opts": "100m"

                                         },

                                         "storage-driver ": "overlay2"

                                }

           

          Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

           

          Arbetsuppgift 2: Läs in den nya konfigurationen

          1. I terminalfönster, skriv in följande kommando och klicka på Enter:

                               sudo systemctl daemon-reload

          2. I terminalfönster, skriv in följande kommando och klicka på Enter:

                               sudo systemctl restart docker


          Arbetsuppgift 3: Verifiera inställningarna


          docker info

          1. I terminalfönstret, skriv in följande kommando och klicka på Enter:

                                docker info

          [ Modified: Friday, 20 March 2020, 7:50 AM ]

          Comments

             
            Anyone in the world

            ETCDCTL


            Installera och konfigurera etcd


            etcd kommer att installeras på easec-linux1, easec-linux2 och easec-linux3. Versionen är 3.4.4 som är den senaste när denna dokumentation skrevs (200317).

             

            Arbetsuppgift 1: Kopiera certifikat till respektive maskin

            1. Anslut till easec-linux8 och logga på som easec med lösenordet Pa$$w0rd.

            scp ca.pem

            2. På easec-linux8 öppna terminalfönstret (ctrl+alt+t) och skriv in följande kommando och klicka på Enter, för att kopiera certifikat till respektive maskin:

                                scp ca.pem kubernetes.pem kubernetes-key.pem easec@192.168.1.21:~

            Ange Pa$$w0rd som lösenord. Om det är första gången du ansluter, får du skriva yes och klicka på Enter.

            3. I terminalfönstret, upprepa föregående kommando, men ändra IP-adress till 192.168.1.22 respektive 192.168.1.23.

             

            Arbetsuppgift 2: Installera etcd

            1. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ansluta till easec-linux1:

                                ssh easec-linux1

             Om det är första gången du ansluter, får du skriva in yes och klicka på Enter, skriv därefter in Pa$$w0rd för att ansluta.

            sudo mkdir /etc/etcd /var/lib/etcd

            2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa konfigurationskataloger för etcd:

                                sudo mkdir /etc/etcd /var/lib/etcd

            Skriv in Pa$$w0rd som lösenord för sudo.

            sudo mv ~/ca.pem

            3. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att flytta certifikat till katalogen /etc/etcd:

                                sudo mv ~/ca.pem ~/kubernetes.pem ~/kubernetes-key.pem /etc/etcd

            wget etcd

            4. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att ladda ner binärer för etcd:

                                wget https://github.com/etcd-io/etcd/releases/download/v3.4.4/etcd-v3.4.4-linux-amd64.tar.gz

            tar xvzf

            5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att packa upp binärer för etcd:

                                tar xvzf etcd-v3.4.4-linux-amd64.tar.gz

            sudo mv etcd

            6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att flytta binärer till /usr/local/bin:

                                sudo mv etcd-v3.4.4-linux-amd64/etcd* /usr/local/bin/


            Arbetsuppgift 3: Skapa systemd-fil

             

            1. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa systemd-fil:

                                sudo nano /etc/systemd/system/etcd.service

            I mitt förråd på GitHub finns etcd.service-filer för respektive maskin (https://github.com/easec/cluster/tree/master/stacked)

            sudo nano /etc/systemd/system/etcd.service

            2. I fönstret för nano, skriv in följande:

             

                                [Unit]

                                Description=etcd

                                Documentation=https://github.com/coreos

             

                                [Service]

                                ExecStart=/usr/local/bin/etcd \

                                 --name 192.168.1.21 \

                                 --cert-file=/etc/etcd/kubernetes.pem \

                                 --key-file=/etc/etcd/kubernetes-key.pem \

                                 --peer-cert-file=/etc/etcd/kubernetes.pem \

                                 --peer-key-file=/etc/etcd/kubernetes-key.pem \

                                 --trusted-ca-file=/etc/etcd/ca.pem \

                                 --peer-trusted-ca-file=/etc/etcd/ca.pem \

                                 --peer-client-cert-auth \

                                --client-cert-auth \

                                --initial-advertise-peer-urls https://192.168.1.21:2380 \

                                --listen-peer-urls https://192.168.1.21:2380 \

                                --listen-client-urls https://192.168.1.21:2379,http://127.0.0.1:2379 \

                                --advertise-client-urls https://192.168.1.21:2379 \

                                --initial-cluster-token etcd-cluster-0 \

                                --initial-cluster 192.168.1.21=https://192.168.1.21:2380,192.168.1.22=https://192.168.1.22:2380,192.168.1.23=

                                https://192.168.1.23:2380 \

                                --initial-cluster-state new \

                                --data-dir=/var/lib/etcd

                                Restart=on-failure

                                RestartSec=5


                                [Install]

                                WantedBy=multi-user.target

             

            Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

            sudo systemctl daemon-reload

            3. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att återinläsa konfigurationen för daemon:

                                 sudo systemctl daemon-reload

            sudo systemctl enable etcd

            4. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att starta etcd vid uppstart:

                                 sudo systemctl enable etcd

            sudo systemctl start etcd

            5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att starta etcd:

                                 sudo systemctl start etcd

            6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att avsluta session mot Easec-Linux1:

                                 exit

            7. Gör om arbetsuppgift 2 och 3 på easec-linux2 och easec-linux3 med respektive IP-adresser.


            Arbetsuppgift 4: Verifiera klustret

            ETCDCTL

            1. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att verifiera klustret och att det är igång:

                                 ETCDCTL_API=3 etcdctl member list



            Notering felsökning:

            Ibland händer det att det går fel :-), när systemd används så är kommandot journalctl ett bra verktyg för att se vad som har gått fel.

            Exempelvis: sudo journalctl -u etcd.service (om det är etcd), eftersom det kan bli väldigt mycket information kan det vara bra att lägga denna i en textfil, för att sedan undersöka denna textfil lite närmare sudo journalctl -u etcd.service > logg.txt

            Gör du förändringar, kör dessa kommando:

            sudo systemctl daemon-reload

            sudo systemctl restart etcd











            [ Modified: Wednesday, 18 March 2020, 2:25 PM ]

            Comments

               
              Picture of Mats Johannesson
              by Mats Johannesson - Tuesday, 17 March 2020, 1:51 PM
              Anyone in the world

              Miljö

              Installation av HA-proxy


              HA-proxy kommer att installeras på Easec-Linux7 (192.168.1.27/24).

               

              Arbetsuppgift 1: Installera HA-proxy

              1. Anslut till Easec-Linux7 och logga på som easec med lösenordet Pa$$w0rd.

              sudo apt-get update

              2. På Easec-Linux7 öppna terminalfönstret (ctrl+alt+t) och skriv in följande kommando och klicka på Enter, för att uppdatera referenser till arkiv:

               

                                sudo apt-get update 

              Ange Pa$$w0rd som lösenord för sudo.

              sudo apt-get install haproxy

              3. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att installera HA-proxy:

                                sudo apt-get install haproxy


              Arbetsuppgift 2: Konfigurera HA-proxy

              1.     I terminalfönstret, skriv in följande kommando och klicka på Enter, för att konfigurera HA-proxy:

                               sudo nano /etc/haproxy/haproxy.cfg

              sudo nano /etc/haproxy/haproxy.cfg

              2. I fönstret med nano, gör förändringar i fetstil:

               

                               global

                               ...

                               default

                               ...

                               frontend kubernetes

                                            bind 192.168.1.27:6443

                                            option tcplog

                                            mode tcp

                                            default_backend kubernetes-master-nodes


                                backend kubernetes-master-nodes

                                            mode tcp

                                            balance roundrobin

                                            option tcp-check

                                            server easec-linux1 192.168.1.21:6443 check fall 3 rise 2

                                            server easec-linux2 192.168.1.22:6443 check fall 3 rise 2

                                            server easec-linux3 192.168.1.23:6443 check fall 3 rise 2

               

              Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

              sudo systemctl restart haproxy

              2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att starta om HA-proxy:

                                           sudo systemctl restart haproxy






              [ Modified: Tuesday, 17 March 2020, 2:13 PM ]

              Comments

                 
                Anyone in the world


                Miljö

                Del 1: Klientverktyg


                På klientdator kommer två verktyg att behövas installeras, Cloud Flare SSL för att generera de olika certifikat som behövs och kubectl för att hantera klustret. Dessa verktyg installeras på Easec-Linux8.

                 

                Arbetsuppgift 1: Installera cfssl

                1. Anslut till Easec-Linux8 och logga på som easec med lösenordet Pa$$w0rd.


                Installation av cfssl

                2. På Easec-Linux8 öppna terminalfönstret (ctrl+alt+t) och skriv in följande kommando och klicka på Enter:

                          wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

                3. I terminalfönstret skriv in följande kommando och klicka på Enter, för att sätta exekveringsrättigheter:

                           chmod +x cfssl*

                Flytt av binärer

                4. I terminalfönstret skriv in följande kommando och klicka på Enter, för att flytta binärer till /usr/local/bin:

                            sudo mv cfssl_linux-amd64 /usr/local/bin/cfssl

                            Ange Pa$$w0rd som lösenord för sudo.

                5. I terminalfönstret skriv in följande kommando och klicka på Enter, för att flytta binärer till /usr/local/bin:

                             sudo mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

                cfssl version

                6. I terminalfönstret skriv in följande kommando och klicka på Enter, för att verifiera installationen:

                             cfssl version


                Arbetsuppgift 2: Installera kubectl

                Installera kubectl

                1. I terminalfönstret skriv in följande kommando och klicka på Enter, för att ladda ner binärer för kubectl:

                              wget https://storage.googleapis.com/kubernetes-release/release/v1.17.3/bin/linux/amd64/kubectl

                 2. I terminalfönstret skriv in följande kommando och klicka på Enter, för att sätta exekveringsrättigheter:

                              chmod +x kubectl*

                3. I terminalfönstret skriv in följande kommando och klicka på Enter, för att flytta binärer till /usr/local/bin:

                              sudo mv kubectl /usr/local/bin

                kubectl version

                4. I terminalfönstret skriv in följande kommando och klicka på Enter, för att verifiera installationen:

                              kubectl version

                              Felmeddelande om att verktyget inte kan ansluta till server, kan du ignorera. Det finns ingen server eller servrar i detta läge!


                Del 2: Certifikat

                Ett antal certifikat kommer att behöva genereras.

                Arbetsuppgift 1: Skapa Certificate Authority och generera certifikat

                Konfiguration av CA

                1. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa konfiguration för CA (Certificate Authority):

                               nano ca-config.json

                2. I fönstret med nano, skriv in följande:

                               {

                                   "signing": {

                                      "default": {

                                         "expiry": "8760h"

                                       },

                                       "profiles": {

                                           "kubernetes": {

                                               "usages": ["signing", "key encipherment", "server auth", "client auth"],

                                               "expiry": "8760h"

                                        }

                                     }

                                   }

                                 }

                Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen. 

                nano ca-csr.json

                3. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa certifikatbegäran för CA:

                                  nano ca-csr.json

                4. I fönstret med nano, skriv in följande:

                                  {

                                     "CN": "Kubernetes",

                                     "key": {

                                     "algo": "rsa",

                                     "size": 2048

                                   },

                                   "names": [

                                   {

                                      "C": "SE",

                                      "L": "Lomma",

                                      "O": "Kubernetes",

                                      "OU": "CA",

                                      "ST": "easec"

                                     }

                                   ]

                                  }

                 Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.

                cfssl gencert

                5. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa certifikat och privat nyckel:

                                  cfssl gencert -initca ca-csr.json | cfssljson -bare ca

                ls -la ca*

                6. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att verifiera att ca-key.pem och ca.pem har blivit genererade:

                                   ls -la ca*

                7. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att skapa certifikatbegäran för etcd-kluster:

                                   nano kubernetes-csr.json

                nano kubernetes-csr.json

                8. I fönstret med nano, skriv in följande:

                                 {

                                     "CN": "kubernetes",

                                     "key": {

                                     "algo": "rsa",

                                     "size": 2048

                                   },

                                   "names": [

                                   {

                                      "C": "SE",

                                      "L": "Lomma",

                                      "O": "Kubernetes",

                                      "OU": "Kubernetes",

                                      "ST": "easec"

                                     }

                                   ]

                                  }

                 

                Klicka på ctrl+x, skriv in ett J och klicka på Enter för att spara filen.


                Arbetsuppgift 2: Skapa certifikat och privat nyckel

                cfssl gencert

                1. I terminalfönstret, skriv in följande kommando och klicka på Enter efter varje \ och efter sista raden:

                                    cfssl gencert \

                                    -ca=ca.pem \

                                    -ca-key=ca-key.pem \

                                    -config=ca-config.json \

                                    -hostname=192.168.1.21,192.168.1.22,192.168.1.23, 192.168.1.27,127.0.0.1,kubernetes.default \

                                    -profile=kubernetes kubernetes-csr.json | \

                                    cfssljson -bare kubernetes

                ls -la k*

                2. I terminalfönstret, skriv in följande kommando och klicka på Enter, för att verifiera att kubernetes-key.pem och kubernetes.pem har skapats:

                                     ls -la k*



                [ Modified: Monday, 16 March 2020, 8:31 PM ]

                Comments

                   
                  Picture of Mats Johannesson
                  by Mats Johannesson - Sunday, 15 March 2020, 9:16 PM
                  Anyone in the world

                  Kluster

                  .easec kommer att publicera ett antal artiklar där konfiguration av Kubernetes i drift beskrivs. 


                  De olika delarna:

                  Del 1: Certifikat och klientverktyg. https://portal.easec.se/moodle/blog/index.php?entryid=39

                  Del 2: HA-Proxy. https://portal.easec.se/moodle/blog/index.php?entryid=40

                  Del 3: Installera och konfigurera etcd. https://portal.easec.se/moodle/blog/index.php?entryid=41

                  Del 4: Installera master. https://portal.easec.se/moodle/blog/index.php?entryid=44

                  Del 5: Installera worker. https://portal.easec.se/moodle/blog/index.php?entryid=45



                  [ Modified: Friday, 20 March 2020, 11:52 AM ]

                  Comments

                     
                    Picture of Mats Johannesson
                    by Mats Johannesson - Thursday, 5 March 2020, 9:13 PM
                    Anyone in the world

                    Roll för Ops och för Dev


                    Arbeta med bestående lagring i Kubernetes


                    När jag har läst dokumentationen från Kubernetes, så har det varit lite svårt att förstå hur detta konfigureras. Så det är väl lika bra att gå igenom detta steg för steg.


                    Övergripande steg

                    1. Konfigurera lagring.
                    2. Skapa .yaml-fil för lagring  (ansvaret ligger på Ops). 
                    3. Skapa .yaml-fil för begäran (eng. claim) (ansvaret ligger på Dev).
                    4. Skapa .yaml-fil för pod som för lagringsdelen refererar til claim (ansvaret ligger på Dev).
                    5. Starta pod.
                    Beroende lite på funktionalitet kan storageClass behöva konfigureras. I mitt kursmaterial finns detta beskrivet dels i det teoretiska materialet, men även i en övning där lokal lagring skall användas. 


                    Steg 1. Konfigurera lagring

                    Detta beror på vilken typ av lagring som skall användas. I mina övningsexempel används både lokal lagring på nod (easec-linux2) och på NFS-server. Båda dessa kommer att behöva konfigureras. Kubernetes kan arbeta med en mängd olika typer av lagring och som finns både lokalt och i molntjänst.

                    Exemplet i denna blogg kommer att använda NFS-server. För att underlätta lite i kurs- och labbsammanhang har .easec tagit fram en docker-container för detta syfte. Dockerfile för denna container finns här: https://github.com/easec/nfs-server . I andra sammanhang är det alltid bäst att sätta upp en "riktig" NFS-server.

                    Förutsättningar: Docker installerat och Kubernetes uppsatt enligt .easec:s specifikationer. git installerat liksom nfs-utils  (på Ubuntu: sudo apt-get install nfs-kernel-server) på alla ingående maskiner.

                    På https://github.com/easec/Kubernetes finns alla .yaml-filer som refereras, klona dessa till din hemmakatalog med kommandot git clone https://github.com/easec/Kubernetes.git .


                    1. Öppna terminalfönstret och skriv in följande kommando och klicka på Enter efter varje rad:

                        docker run -d --net=host \ 

                        --privileged --name nfs-server \

                        easec/nfs-server \

                        /exports/data-0001 /exports/data-0002

                        Container kommer att exponera två stycken kataloger, /exports/data-0001 och /exports/data-0002.


                    Steg 2: Skapa .yaml-fil för lagring (pv)

                    1. Om du har klonat mitt arkiv, förflytta dig till katalogen Kubernetes/persistent-volumes.

                    2. Öppna filen nfs-0001.yaml i din editor.

                    nfs-0001

                    Lägg märke till att kapacitet anges under spec:, accessModes anger typ av access, i mitt kursmaterial har jag beskrivit de olika typerna av access som finns. På ett liknande sätt finns det även beskrivit de olika typerna av persistentVolumeReclaimPolicy som finns. Under nfs: anges anslutningsinformation till den maskin där docker-container med NFS-server körs och i detta fallet den första katalogen.

                    3. Applicera denna .yaml-fil med kommandot: kubectl create -f nfs-0001.yaml .

                    4. Öppna filen nfs-0002.yaml i din editor.

                    nfs-0002

                    Denna .yaml-fil liknar den första, med två undantag. Det första undantaget är kapaciteten (i den första var den satt till 2Gi) som är satt till 5Gi och det andra undantaget är referens till katalog och i detta fallet pekar denna på den andra katalogen som exponeras av NFS-server.

                    5. Applicera denna .yaml-fil med kommandot: kubectl create -f nfs-0002.yaml .

                    kubectl get pv

                    6. För att se alla PersistentVolumes i klustret, använd kommandot kubectl get pv .

                     

                    Steg 3: Skapa .yaml-fil för claim (pvc)

                    1. Öppna filen pvc-mysql.yaml i din editor.

                    pvc-mysql.yaml

                    Denna fil beskriver vad som begärs av eventuell pod som kopplas mot denna claim. I detta fallet kommer det att krävas att lagringen har möjlighet att exponera 3Gi. Går du tillbaks lite i denna bloggtext, så ser du att det är bara pv mot nfs-0002 som har denna kapacitet.


                    2. Applicera denna .yaml-fil med kommandot: kubectl create -f pvc-mysql.yaml .

                    3. Öppna filen pvc-http.yaml i din editor.

                    pvc-http.yaml

                    Precis som tidigare fil (pvc-mysql.yaml) beskriver denna vad som begärs av eventuell pod som kopplas mot denna claim. I detta fallet kommer det att krävas att lagringen har möjlighet att exponera 1Gi.

                    4. Applicera denna .yaml-fil med kommandot: kubectl create -f pvc-http.yaml .

                    kubectl get pvc

                    5. För att se alla claims i klustret, använd kommandot kubectl get pvc . När du har kört kommandot, kommer du att se att claim-http är associerat med nfs-0001 och claim-mysql är associerat med nfs-0002. Du kan även se den totala kapaciteten för respektive lagring.


                    Steg 4: Skapa .yaml-fil för pods

                    1. Öppna filen pod-mysql.yaml i din editor. 

                    pod-mysql

                    Under sektionen containers kan du se att pod kommer att baseras på avspeglingen openshift/mysql-55-centos7, ett antal miljövariabler är definierade (i produktion används exempelvis Secrets för detta), monterar volym till katalogen /var/lib/mysql/data. Under sektionen volumes finns referens till claim-mysql.

                    2. Öppna filen pod-http.yaml i din editor. 

                    pod-html

                    Under sektionen containers kan du se att pod kommer att baseras på avspeglingen nginx:alpine, port 80 kommer att exponeras, monterar volym till katalogen /usr/share/nginx/html. Under sektionen volumes finns referens till claim-http.


                    Steg 5: Starta pods
                    1. Starta pod-mysql med kommandot: kubectl create -f pod-mysql.yaml . Vi kommer inte att använda denna, annat än för att se att den plockar "rätt" lagring utifrån claim.


                    2. Starta pod-http med kommandot: kubectl create -f pod-http.yaml .

                    kubect get pods

                    3. Använd kommandot kubectl get pods för att verifiera att dessa körs. Tänk på om du inte installerade nfs-utils (på Ubuntu: sudo apt-get install nfs-kernel-server) på noderna, kommer någon pod att stå läget att den skapas under längre tid. För att se vad som händer, kan du använda kommandot kubectl describe pod <namnet_på_denna_pod>, troligtvis har du ett felmeddelande att volym inte kan monteras. Installera nfs-utils och strax kommer du att se att pod är i läget Ready,


                    Extra: verifiera funktion

                    docker exec

                    1. Anslut till docker-container nfs-server och skapa index.html, använd kommandot:  docker exec -it nfs-server bash -c "echo '<h1> The end is near</h1>You are not getting any younger and neither are your forms.' > /exports/data-0001/index.html" . Om du vill ansluta till pod kan du använda kommandot kubectl exec -it <namn_på_pod> bash .

                    ip

                    2. Ta reda på IP-adress för pod, genom att använda följande kommando: ip=$(kubectl get pod www -o yaml | grep podIP | awk '{split($0,a,":"); print a[2]}'); echo $ip .

                    curl_ip

                    3. Verifiera med kommandot curl $ip att texten du skrev in under punkt 1 visas.

                    the end is near

                    4. Om du har webbläsare, kan du ansluta denna till pod och texten du skrev in under punkt  1 visas.

                    I .easec:s kurs arbetar du vidare med dessa pods.


                    Rensa

                    Använd stegen nedan för att rensa din miljö!

                    1. Använd kommandot kubectl delete pod www mysql för att plocka bort pods.

                    2. Använd kommandot kubectl delete pvc claim-http claim-mysql för att plocka bort pvc.

                    3. Använd kommandot kubectl delete pv nfs-0001 nfs-0002 för att plocka bort pv.

                    4. Använd kommandot docker stop nfs-server && docker rm nfs-server för att stänga ner docker-container och plocka bort denna.






                    [ Modified: Friday, 6 March 2020, 10:39 AM ]

                    Comments

                       
                      Page: () 1 2 3 4 5 ()

                        
                      RSS